当前位置: 首页 > 面试题库 >

管道Popen stderr和stdout

彭礼骞
2023-03-14
问题内容

我想通过python从目录中调用脚本(它们是可执行的shell脚本)。

到现在为止还挺好:

    for script in sorted(os.listdir(initdir), reverse=reverse):
        if script.endswith('.*~') or script == 'README':
             continue
        if os.access(script, os.X_OK):
            try:
                execute = os.path.abspath(script)
                sp.Popen((execute, 'stop' if reverse else 'start'),
                         stdin=None, stderr=sp.PIPE,
                         stdout=sp.stderr, shell=True).communicate()
            except:
                raise

现在我想要的是:假设我有一个具有启动功能的bash脚本。我从那里打电话

回声“某事”

现在,我想看看sys.stdout和退出代码上的回显。我相信您可以使用.communicate()执行此操作,但是我的操作不符合我的预期。

我究竟做错了什么?

任何帮助深表感谢


问题答案:

授予http://docs.python.org/library/subprocess.html。

communication()返回一个元组(stdoutdata,stderrdata)。

子流程完成后,您可以从Popen实例获取返回代码:

Popen.returncode:子返回码,由poll()和wait()设置(并由communication()间接设置)。

同样,您可以实现以下目标:

sp = subprocess.Popen([executable, arg1, arg2], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = sp.communicate()
if out:
    print "standard output of subprocess:"
    print out
if err:
    print "standard error of subprocess:"
    print err
print "returncode of subprocess:"
print sp.returncode

顺便说一句,我会改变测试

    if script.endswith('.*~') or script == 'README':
         continue

变成一个积极的:

if not filename.endswith(".sh"):
    continue

明确声明要执行的内容比明确声明 执行的内容要好。

另外,您应该以更通用的方式命名变量,因此script应该filename放在首位。由于listdir还列出了目录,你可以明确地检查这些。try/except只要您不处理特定的异常,当前的块就不合适。取而代之的是abspath,您应该只连接initdirfilename,这是一个经常在上下文中应用的概念os.listdir()。出于安全原因,仅在绝对确定需要时才shell=TruePopen对象的构造函数中使用它。让我提出以下建议:

for filename in sorted(os.listdir(initdir), reverse=reverse):
    if os.path.isdir(filename) or not filename.endswith(".sh"):
         continue
    if os.access(script, os.X_OK):
        exepath = os.path.join(initdir, filename)
        sp = subprocess.Popen(
            (exepath, 'stop' if reverse else 'start'),
            stderr=subprocess.PIPE,
            stdout=subprocess.PIPE)
        out, err = sp.communicate()
        print out, err, sp.returncode


 类似资料:
  • 我有一个azure构建管道和发布管道。我在发布构建工件中面临问题。在构建管道中,发布构建工件被正确地创建在默认的“drop”目录中。 当我在发布管道中下载该工件时,发布文件正在服务抛出错误的中下载 您没有查看此目录或页面的权限。 这意味着我的发布工件没有在“home/wwwroot”目录中下载。 构建管道 释放管道 我错过了什么?

  • 问题内容: 我必须编写一个可以运行管道的外壳。例如“” 这样的命令。我已成功解析了用户给出的命令,如下所示: “ ls” = firstcmd “ -l” = frsarg “ wc” = scmd “ -l” = secarg 现在,我必须使用两个fork,因为命令分别是两个和一个管道。我为执行命令编写的代码块如下: 因此,当我运行外壳程序并输入命令(例如)时,执行程序的结果不会显示,但外壳程序

  • 无状态管道是纯粹的功能,通过输入数据流动而不记住任何东西或引起可检测的副作用。 大多数管道是无状态的。 我们使用的CurrencyPipe和我们创建的长度管是无状态管的示例。 状态管道是能够管理它们转换的数据的状态的管道。 创建HTTP请求,存储响应并显示输出的管道是有状态的管道。 有状态管道应谨慎使用。 Angular 2提供 ,这是有状态的。 View Example 实现有状态管道 // n

  • 传递参数 链接管道 我们可以将多个管道连接在一起,以便在一个表达式中使用多个管道。

  • 使装饰器包含具有name属性的管道元数据。 此值将用于在模板表达式中调用此管道。 它必须是有效的JavaScript标识符。 实现PipeTransform接口的transform方法。 此方法接受管道的值和任何类型的可变数量的参数,并返回一个变换的(“管道”)值。 import { Component } from '@angular/core'; selector: 'app-root',

  • 主要内容:示例程序,使用管道双向通信管道是两个或更多相关或相关进程之间的通信媒介。 它可以在一个进程内,也可以在子进程和父进程之间进行通信。 通信也可以是多层次的,如父进程,子进程和子进程之间的沟通等。通信是通过一个过程写入管道和从管道读取来实现的。 要实现管道系统调用,请创建两个文件,一个写入文件,另一个从文件读取。 管道机制可以用一个实时的场景来看,比如用管子把水灌进一个容器里。 填充过程可以理解为是写入管道,读取过程只不过是从