2014-02-17 134 views
1

Python在我的Python项目中使用Popen时遇到了一些麻烦。基本上我有一个用户可以键入到文本小部件的GUI。在按下按钮时,文本将被保存到一个新文件中,然后作为一个python文件在使用popen的子流程中运行。所以基本上,我的GUI充当IDE的一种类型,让用户输入他们的代码,按下“运行”按钮,然后他们键入的脚本作为子进程运行。Python强制子进程失败并返回非零代码

一切工作正常,但我很努力弄清楚如何检测用户的代码中的语法错误。我试图做这样的事情:

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

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

没有这个代码我的程序确实如预期,只要不存在任何语法错误运行子进程,然而与此,脚本的预期行为的用户输入没有完成,并且返回值也始终为0,无论语法错误。我认为这可能是因为线程已经正确执行,无论它在哪里。

我也尝试添加的东西,如:

sys.exit(1) 

进入子代码,迫使脚本与特定的返回码退出但它似乎仍然返回0。再次,我想这是因为SYS。 exit()只能在程序的主线程中运行,但我不确定。

所以基本上我试图找出一种方法来使一个子进程的返回代码的值不是0,因为它由于用户的语法错误而无法正常运行。

另一种方法,我想打开一个管道stderr时,我做popen但是我真的不需要读取错误信息是什么。我的计划是如果某个键被错误键入,只会引发某种类型的通用错误消息。

非常感谢您阅读本文,很抱歉,如果它很混乱。

+0

我无法复制它。 'subprocess.call([“python”,“-c”,“import sys; sys.exit(1)”])'返回'1'作为出口代码。你能提供一个完整的小例子来证明这个问题吗? – jfs

回答

0

即使您可以得到这个工作,您的用户会恨你告诉他们脚本中有语法错误,但不是他们在哪里。

所以,不要担心子,并使用内置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

+0

这真诚地看起来太好了,不可能是真的。我刚开始Python编程,似乎有这么多令人惊讶的东西,我甚至不会想象存在。这看起来会解决下一个问题,我会告诉他们在实际回来之后出现错误的位置。非常感谢您向我展示这一点。我会明天尝试,希望取得一些成功。 – Dellgloom

0

从在Python sys.exit()

退出的文档。这是通过提高异常来实现的,因此可以使用try 语句的finally子句中指定的清理操作,并且可以拦截在外层尝试的出口 。

[omissis]

由于exit()最终“只”引发了异常,它只会 退出主线程调用时的过程,异常 不拦截。

所以,你是正确的,调用sys.exit()结束进程时没有在主线程。而不是调用sys.exit()你应该终止线程并以某种方式发信号给主线程,它必须以错误退出。

但是,从回答中不清楚线程是如何组织的。特别是你使用subprocess的事实并没有什么与行为有关,据我了解至少。如果主线程正在运行GUI,则应该产生一个GUI事件以表示要关闭。

此外,我真的不明白为什么必须使用GUI启动一个全面的过程来检查语法。你应该有一个解析器来检查。 GUI库如Qt提供了内置小部件来处理代码突出显示等。

+0

感谢您的回复。我有一种感觉,我的问题可能有点不清楚。基本上,我的程序要做的是在我的GUI上记录一个写在Text小部件中的Python脚本,在按下按钮时将它写入文件,然后将该文件作为子进程上的脚本运行。一次只能打开一个子进程。 子进程不仅仅是检查语法,而是在子进程中运行用户的脚本,与一个硬件进行交互。使用民意调查,等待或沟通阻止脚本做任何事情,所以我希望使用返回代码将帮助我解决它。 – Dellgloom

+0

@Dellgloom我不明白线索在你的描述中起什么作用。如果用户在其脚本中使用它们*他*应该处理它们,以便子过程返回正确的返回码。你不能做太多的事情。 – Bakuriu

+0

我再次为这种困惑而道歉。我认为当创建一个子进程时,它在一个线程上运行。 (我对这一切都很新颖)。用户不会在其脚本中使用线程。 – Dellgloom

相关问题