相关疑难解决方法(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万
查看次数

从subprocess.communicate()读取流输入

我正在使用Python subprocess.communicate()来从一个运行大约一分钟的进程中读取stdout.

如何stdout以流式方式打印出该流程的每一行,以便我可以看到生成的输出,但在继续之前仍然阻止流程终止?

subprocess.communicate() 似乎立刻提供所有输出.

python subprocess

75
推荐指数
3
解决办法
7万
查看次数

捕获子进程输出

我了解到在Python中执行命令时,我应该使用子进程.我想要实现的是通过ffmpeg编码文件并观察程序输出直到文件完成.Ffmpeg将进度记录到stderr.

如果我尝试这样的事情:

child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE)
complete = False
while not complete:
    stderr = child.communicate()

    # Get progress
    print "Progress here later"
    if child.poll() is not None:
        complete = True
    time.sleep(2)
Run Code Online (Sandbox Code Playgroud)

调用child.communicate()并等待命令完成后,程序不会继续.还有其他方法可以跟随输出吗?

python subprocess

25
推荐指数
1
解决办法
3万
查看次数

将os.popen(命令)读入字符串

我不确定我的头衔是否合适.我正在做的是编写一个python脚本来自动化我的一些代码编写.所以我正在解析.h文件.但我想在开始之前扩展所有宏.所以我想调用shell来:

gcc -E myHeader.h
Run Code Online (Sandbox Code Playgroud)

哪个应该将myHeader.h的post preprocessed版本放到stdout中.现在我想直接将所有输出读入字符串以进行进一步处理.我已经读过我可以用popen做到这一点,但我从未使用过管道对象.

我该怎么做呢?

python string popen

15
推荐指数
3
解决办法
8万
查看次数

python子进程模块:循环遍历子进程的stdout

我有一些使用子进程模块运行的命令.然后我想循环输出的行.文档说不要做data_stream.stdout.read我不是,但我可能正在做一些调用它的东西.我像这样循环输出:

for line in data_stream.stdout:
   #do stuff here
   .
   .
   .
Run Code Online (Sandbox Code Playgroud)

这会导致死锁,例如从data_stream.stdout读取,还是为这种循环设置的Popen模块,以便它使用通信代码但是为你处理它的所有调用?

python subprocess

5
推荐指数
2
解决办法
7852
查看次数

Python调用多个命令

我想从我的python脚本调用多个命令。我尝试使用os.system(),但是在更改当前目录时遇到问题。

例:

os.system("ls -l")
os.system("<some command>") # This will change the present working directory 
os.system("launchMyApp") # Some application invocation I need to do.
Run Code Online (Sandbox Code Playgroud)

现在,第三个调用启动无效。

python command subprocess

5
推荐指数
3
解决办法
3万
查看次数

标签 统计

python ×6

subprocess ×5

command ×1

popen ×1

string ×1