在我的Python脚本中调用.exe文件时出现错误

0 投票
3 回答
924 浏览
提问于 2025-04-17 14:55

我在用 wxpython 做图形界面(GUI),用 bash 写脚本。我需要通过 Python 脚本来运行一个 .exe 文件,使用的是 subprocess 这个模块。

目的: 我必须把参数从图形界面传递给 .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,任何帮助或建议都很有用。

3 个回答

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) 
0

我觉得这个错误很明显:“execv() 的第二个参数必须只包含字符串”,而你传入了一个整数作为第一个参数。将整数转换成字符串可以用 str() 来实现。

另外,subprocess.call 需要一个字符串数组,第一个字符串是要调用的程序,后面的字符串是要传给这个程序的参数。所以如果你想用参数 123(或者 lan1 的值)来调用 home/proj/lic.exe,你需要调整一下顺序。

subprocess.call([arg, str(lan1)], shell = True)
1

subprocess.call的第一个参数里,所有的项目都必须是字符串,也就是文本形式的内容:

rc = subprocess.call(['/home/proj/lic.exe', str(lan1)])

另外,你不应该在图形用户界面(GUI)的事件处理程序中调用可能会长时间阻塞的函数;这样会让你的界面长时间卡住。你可以使用subprocess.Popen来立即返回,然后安排一个空闲回调,定期检查子进程的状态。

撰写回答