我使用wxpython
用于GUI,使用bash用于脚本。我必须使用子进程从Python脚本运行.exe
文件。
目的:必须将参数从GUI传递到.exe
文件,并且无权检查它。
我遇到问题的部分代码是:
import subprocess
def OnBound(self,event):
lan1 = self.sc1.Getvalue() ##interger value
arg = ('home/proj/lic.exe')
subprocess.call([lan1, arg], shell = True)
每当我运行脚本时,我都会收到以下错误:
Traceback (most recent call last)
File "/usr/lib/python 2.7/subprocess.py", line 493, in call return popen(*popnargs, **kwargs).wait()
File "/usr/lib/python 2.7/subprocess.py", line 679, in __init__errread,errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1239, in _execute_child raise child_exception
Type error: execv() arg 2 must contain only strings
我在这里做错了什么?任何帮助/建议都会有所帮助,因为我是python的新手。
答案 0 :(得分:1)
subprocess.call
的第一个参数中的所有项都必须是字符串:
rc = subprocess.call(['/home/proj/lic.exe', str(lan1)])
此外,您不应该从GUI事件处理程序中调用可能长时间阻塞的函数;它可以长时间冻结你的GUI。您可以调用subprocess.Popen
立即返回并安排空闲回调以定期轮询子进程状态。
答案 1 :(得分:0)
我不确定你要完成什么,但我可以使用
重现你的错误import subprocess
subprocess.call([123, 'ls'], shell = True)
或
import subprocess
subprocess.call(['ls', ('-l',)], shell = True)
在这两种情况下,我都将垃圾作为列表值之一传递(第一种情况下为整数,第二种情况下为元组)。
您的代码中的注释告诉lan1
是一个整数,因此您尝试运行类似
123 home/proj/lic.exe
这没有意义。
使用subprocess
这样更简单:
subprocess.call("ls -l | grep test", shell=True)
答案 2 :(得分:0)
我认为错误非常明确:“execv()arg 2必须只包含字符串”,而传递一个整数作为第一个参数。
将整数转换为字符串可以使用str()
除此之外:subprocess.call
接受一个字符串数组,其中第一个字符串是要调用的程序,其余的是要传递给该程序的参数。
因此,如果您想使用参数home/proj/lic.exe
(或123
的任何值)调用lan1
,您应该切换订单。
subprocess.call([arg, str(lan1)], shell = True)