Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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 使用子流程获取print()实时输出_Python_Subprocess - Fatal编程技术网

Python 使用子流程获取print()实时输出

Python 使用子流程获取print()实时输出,python,subprocess,Python,Subprocess,我想从另一个Python文件执行一个Python文件,并在不等待的情况下(实时)显示所有print()输出和错误输出 我的代码的简化版本如下,我希望在不等待“结束”(脚本的结尾)的情况下显示“开始”和错误消息 我还有run.py: import subprocess def run(): subprocess.run(["python", "main.py"]) if __name__ == '__main__': run() 我在stackoverflow上尝试了和其他

我想从另一个Python文件执行一个Python文件,并在不等待的情况下(实时)显示所有
print()
输出和错误输出

我的代码的简化版本如下,我希望在不等待“结束”(脚本的结尾)的情况下显示“开始”和错误消息

我还有
run.py

import subprocess

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


if __name__ == '__main__':
    run()

我在stackoverflow上尝试了和其他几个类似的答案,但没有一个有效,所以我决定把我的原始代码放在这里,上面就是。

这一行是错误的吗

if __name__ == "main":

符号是由解释器设置的
\uuuuu main\uuuu
,而不是
main
。可能是因为这个打字错误,没有代码从主脚本运行。首先尝试直接在命令shell上执行主脚本

以下内容似乎适合我(在Windows上)。它使用
subprocess.Popen()。它关闭
缓冲
以消除可能导致的任何延迟,并将stderr重定向到stdout,以便从单个源检索所有输出。。另请注意,它还包括@Ketan Mukadam提到的更正,即在您的第一个脚本中增加了
\uuu name\uuuu
的值

主脚本.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")
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

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")
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
的输出:

import subprocess

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


if __name__ == '__main__':
    run()
开始
回溯(最近一次呼叫最后一次):
文件“main_script.py”,第10行,在
main()
文件“main_script.py”,第6行,在main中
x+=1#这会引发一个错误
UnboundLocalError:赋值前引用了局部变量“x”

尝试使用check\u output()实现链接的博客文章时遇到了哪些困难?stdout是缓冲的,因此您可能需要执行
print('start',flush=True)
来强制输出,以便侦听进程可以检索某些内容…我认为子进程没有
run()
方法,它应该是
call()
,对吗?@KetanMukadam: