Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从外部进程Python 2获取实时日志_Python_Subprocess - Fatal编程技术网

如何从外部进程Python 2获取实时日志

如何从外部进程Python 2获取实时日志,python,subprocess,Python,Subprocess,在文档文件夹中创建文件夹temp: /My Documents/temp 将这几行保存为worker.pyPython脚本: import time from datetime import datetime for i in range(10): print '%s...working on iteration %s' % (datetime.now(), i) time.sleep(0.2) print '\nCompleted!\n' 将下面的代码另存为caller.

在文档文件夹中创建文件夹
temp

/My Documents/temp

将这几行保存为
worker.py
Python脚本:

import time 
from datetime import datetime
for i in range(10):
    print '%s...working on iteration %s' % (datetime.now(), i)
    time.sleep(0.2) 
print '\nCompleted!\n'
将下面的代码另存为
caller.py

import subprocess
cmd = ['python', 'worker.py']
stdout = subprocess.check_output(cmd)
print stdout
(请注意,两个Python脚本都保存在同一个文件夹中)。

现在使用OS X终端或Windows CMD窗口将当前目录更改为您创建的文件夹:

cd/My Documents/temp

现在运行:

python调用者.py

完成此过程需要2秒钟。完成后,它会立即打印整个进度日志:

2018-01-20 07:52:14.399679...working on iteration 0
...
2018-01-20 07:52:16.216237...working on iteration 9
Completed!
我不希望打印日志(在流程完成后立即打印),而是希望有一个实时的进度更新。我希望在打印过程中的每一行都发生在同一时刻。
所以,当我运行
pythonworker.py
命令时,它将实时地逐行更新。如何实现它?

要从子流程获取实时提要,可以在caller.py中使用此代码

import time 
import subprocess

# Start worker process
p = subprocess.Popen(['python', '-u', 'worker.py'], stdout=subprocess.PIPE)

# Loop forever
while True:

    # Get new line value
    l = p.stdout.readline()

    # Stop looping if the child process has terminated
    if p.poll() is not None:
        break

    # Print the line
    print l
注意subprocess.Popen中的-u,您需要无缓冲的标准输出。

使用readline()每次从子流程输出中读取一行。当子流程打印“\n完成”时请注意\你要读三遍。

在本例中,循环将一直运行,直到子流程终止。
不知道回答你的问题,但是考虑使用IPC来交流:你的解决方案是如何与一个问题中的例子一起工作的(两个Python脚本,第一个是代码?Work.Py <代码),第二个是“代码>调用方,Py < /代码>)您的
follow()
函数应在何处以及如何使用?请澄清。@字母数字用正确的代码更新了答案