Python 使用子流程获取print()实时输出
我想从另一个Python文件执行一个Python文件,并在不等待的情况下(实时)显示所有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上尝试了和其他
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: