通过子流程

时间:2018-08-19 13:15:55

标签: python subprocess

我想从另一个Python文件执行一个Python文件,并显示所有print()输出和错误输出,而无需等待(实时)。

我的代码的简化版本如下,我想显示“开始”和错误消息,而不必等待“结束”(脚本的结尾)。

def main():
    # Function that takes a long time (in my actual code)
    x += 1 # this raises an error

if __name__ == "main":
    print("start")
    main()
    print("end")

我也有run.py

import subprocess

def run():
    subprocess.run(["python", "main.py"])


if __name__ == '__main__':
    run()

我尝试过this blog post以及其他一些关于stackoverflow的类似答案,但是没有一个起作用,所以我决定将我的原始代码放在上面。

2 个答案:

答案 0 :(得分:1)

这行是错误的吗?

Progress: 0%

符号是由解释器设置的if __name__ == "main": ,而不是__main__。由于这种错字错误,有可能没有从主脚本运行任何代码。尝试首先直接在命令外壳上执行主脚本。

答案 1 :(得分:1)

以下似乎对我有用(在Windows上)。它使用subprocess.Popen()执行其他脚本,因为这样可以更好地控制发生的情况。它关闭buffering以消除可能引起的任何延迟,并且将stderr重定向到stdout以便可以从单个来源检索所有输出。也请注意,它还包括@Ketan Mukadam提到的更正{{3 }}在第一个脚本中使用__name__的值。

main_script.py

def main():
    # Function that takes a long time (in my actual code)
    x += 1 # this raises an error

if __name__ == '__main__':
    print("start")
    main()
    print("end")

run.py

import subprocess
import sys

def run():
    kwargs = dict(bufsize=0,  # No buffering.
                  stdout=subprocess.PIPE,
                  stderr=subprocess.STDOUT,  # Redirect stderr to stdout.
                  universal_newlines=True)
    args = [sys.executable, 'main_script.py']

    with subprocess.Popen(args, **kwargs).stdout as output:
        for line in output:
            print(line, end='')  # Process the output...

if __name__ == '__main__':
    run()

执行run.py的输出:

start
Traceback (most recent call last):
  File "main_script.py", line 10, in <module>
    main()
  File "main_script.py", line 6, in main
    x += 1 # this raises an error
UnboundLocalError: local variable 'x' referenced before assignment