28

我想通过 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() 来做到这一点,但我的并没有像我想象的那样工作。

我究竟做错了什么?

任何帮助深表感谢

4

1 回答 1

70

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

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

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

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

同样,您可以像这样实现您的目标:

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,您应该只连接initdirand filename,这是一个经常在 . 的上下文中应用的概念os.listdir()。出于安全原因,仅当您绝对确定需要它时,才shell=True在对象的构造函数中使用它。Popen让我提出以下建议:

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
于 2012-05-21T10:12:01.290 回答