我想从另一个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的类似答案,但是没有一个起作用,所以我决定将我的原始代码放在上面。
答案 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