问题描述
您好,我正尝试使用Popen打开.py并将arg(如有必要)传递给它。
例如:
python mytool.py --first-arg player1 player2 player3 --second-arg 10 --tenth-arg 150
我正在使用tkinter按钮启动此功能,它在Windows上运行,使用python 3.7 但不在Linux上,出现此错误:
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.7/tkinter/__init__.py",line 1705,in __call__
return self.func(*args)
File "mytool.py",line 131,in start
obj = subprocess.Popen([self.Tipvar.get(),'mytool.py',*filter(lambda x: bool(x[1]),(first_arg,second_arg,third_arg,fourth_arg,fifth_arg,sixth_arg,seventh_arg,eighth_arg,ninth_arg,tenth_arg,eleventh_arg,twelfth_arg))])
File "/usr/lib/python3.7/subprocess.py",line 775,in __init__
restore_signals,start_new_session)
File "/usr/lib/python3.7/subprocess.py",line 1453,in _execute_child
restore_signals,start_new_session,preexec_fn)
TypeError: expected str,bytes or os.pathLike object,not tuple
我正在使用的代码是这样的:
def start(self):
first_arg = ("--first-arg ",self.first_arg_entry.get())
second_arg = ("--second-arg ",self.second_arg_entry.get())
third_arg = ("--third_arg-arg ",self.third_arg_entry.get())
fourth_arg = ("--fourth-arg ",self.fourth_arg_entry.get())
fifth_arg = ("--fifth-arg ",self.fifth_arg_entry.get())
sixth_arg = ("--sixth-arg ",self.sixth_arg_entry.get())
seventh_arg = ("--seventh-arg ",self.seventh_arg_entry.get())
eighth_arg = ("--eighth-arg ",self.eighth_arg_entry.get())
ninth_arg = ("--ninth-arg ",self.ninth_arg_entry.get())
tenth_arg = ("--tenth-arg ",self.tenth_arg_entry.get())
eleventh_arg = ("--eleventh-arg ",self.eleventh_arg_entry.get())
twelfth_arg = ("--twelfth-arg ",self.twelfth_arg_entry.get())
thirteenth_arg = (self.vold.get())
print ("Tool started in terminal")
self.bt_stop.config(state=norMAL)
self.disable_buttons()
global obj
if self.vold.get() == "":
obj = subprocess.Popen([self.Tipvar.get(),twelfth_arg))])
else:
obj = subprocess.Popen([self.Tipvar.get(),'myool.py',twelfth_arg,thirteenth_arg))])
我在做什么错?在 Linux / Windows 上可以做什么工作?
希望你能帮助我。
解决方法
您正在子进程调用中发送元组(圆括号中的参数),我认为这是造成问题的原因。
请。请查看子流程文档以了解更多详细信息,如何传递args,如果不确定数据类型,请使用type()
运算符