gpt4 book ai didi

python - Python强制子进程失败并获得不为零的返回码

转载 作者:行者123 更新时间:2023-12-03 08:00:26 24 4
gpt4 key购买 nike

我在Python项目中使用Popen遇到了一些麻烦。基本上,我有一个GUI,用户可以在其中键入文本小部件。按下按钮后,文本将保存到新文件中,然后使用popen在子进程中作为python文件运行。因此,基本上,我的GUI就像是一种IDE,供用户键入他们的代码,按类似“运行”的按钮,然后他们键入的脚本作为子进程运行。

一切正常,但是我正在努力找出如何检测用户代码中的语法错误。我试图做这样的事情:

p = subprocess.Popen(cmd)
p.wait()

if p.returncode != 0:
print("Fail")

没有此代码,我的程序将在没有语法错误的情况下按预期方式运行并运行子进程,但是使用此方法,用户键入的脚本的预期行为不会完成,并且返回值也始终为0,无论语法错误。我认为这可能是因为无论线程执行了什么,线程都已正确执行。

我也尝试添加以下内容:
sys.exit(1)

进入子进程代码以强制脚本以特定的返回码退出,但是它似乎仍然返回0。再次,我认为这是因为sys.exit()仅在程序的主线程中起作用,但是我不确定。

因此,基本上,我正在尝试一种方法,基于子句的返回代码由于用户语法错误而无法正常运行,从而使子过程的返回代码的值不为0。

我猜的另一种选择是当我 pop 时打开stderr的管道,但是我真的不需要阅读错误消息是什么。我的计划是,如果键入错误的ththign,只会显示某种通用错误消息。

非常感谢您阅读本文,如果造成混淆,请多多包涵。

最佳答案

即使您可以使用它,您的用户也会讨厌您告诉他们脚本中存在语法错误,而不是告诉他们内容或位置错误。

因此,请忽略子进程,而使用内置的compile函数:

    script = 'print(0'
try:
compile(script, '<string>', 'exec')
except SyntaxError as exception:
# do something user-friendly with exception...
else:
# syntax seems okay! run script...

不要被 'exec'参数所欺骗:这仅指定脚本包含的代码类型。如果没有语法错误, compile返回 code object

关于python - Python强制子进程失败并获得不为零的返回码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21828577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com