相关疑难解决方法(0)

使用子进程获取实时输出

我正在尝试为命令行程序(svnadmin verify)编写一个包装器脚本,它将为操作显示一个很好的进度指示器.这要求我能够在输出后立即查看包装程序的每一行输出.

我想我只是执行程序使用subprocess.Popen,使用stdout=PIPE,然后读取每一行,并相应地对其进行操作.但是,当我运行以下代码时,输​​出似乎在某处缓冲,导致它出现在两个块中,第1行到第332行,然后是333到439(输出的最后一行)

from subprocess import Popen, PIPE, STDOUT

p = Popen('svnadmin verify /var/svn/repos/config', stdout = PIPE, 
        stderr = STDOUT, shell = True)
for line in p.stdout:
    print line.replace('\n', '')
Run Code Online (Sandbox Code Playgroud)

稍微查看子进程的文档后,我发现bufsize参数为Popen,所以我尝试将bufsize设置为1(缓冲每行)和0(无缓冲区),但这两个值似乎都没有改变行的传递方式.

此时我开始掌握吸管,所以我编写了以下输出循环:

while True:
    try:
        print p.stdout.next().replace('\n', '')
    except StopIteration:
        break
Run Code Online (Sandbox Code Playgroud)

但得到了相同的结果.

是否有可能获得使用子进程执行的程序的"实时"程序输出?Python中是否有其他选项可以向前兼容(不是exec*)?

python subprocess

124
推荐指数
8
解决办法
9万
查看次数

理解python subprocess.check_output的第一个参数和shell = True

我对如何正确使用Python的子进程模块感到困惑,特别是check_output方法的第一个参数和shell选项.查看下面交互式提示的输出.我将第一个参数作为列表传递,并且根据是否shell=True设置,我得到不同的输出.有人可以解释为什么这是和输出的输出?

>>> import subprocess
>>> subprocess.check_output(["echo", "Hello World!"])
'Hello World!\n'
>>> subprocess.check_output(["echo", "Hello World!"], shell=True)
'\n'
Run Code Online (Sandbox Code Playgroud)

现在,当我将第一个参数作为简单字符串而不是列表传递时,我得到了这个讨厌的堆栈跟踪.为什么会这样?这里发生了什么?

>>> subprocess.check_output("echo Hello World!")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 537, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1228, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Run Code Online (Sandbox Code Playgroud)

但是,当我打开shell = True时,它会完美地运行:

>>> subprocess.check_output("echo Hello World!", shell=True)
'Hello …
Run Code Online (Sandbox Code Playgroud)

python linux shell subprocess

8
推荐指数
1
解决办法
3215
查看次数

标签 统计

python ×2

subprocess ×2

linux ×1

shell ×1