这个python源代码出了什么问题?
import threading
import subprocess as sub
def ben(fil):
pr = sub.Popen(fil,stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = pr.communicate()
print output
theapp = '''blender
blender-softwaregl'''.split()
print theapp
for u in theapp:
print u
tr = threading.Thread(target=ben, args=(u))
tr.daemon = True
tr.start()
错误是:
['blender', 'blender-softwaregl']
blender
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/threading.py", line 551, in __bootstrap_inner
self.run()
File "/usr/local/lib/python2.7/threading.py", line 504, in run
self.__target(*self.__args, **self.__kwargs)
TypeError: ben() takes exactly 1 argument (7 given)
blender-softwaregl
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/threading.py", line 551, in __bootstrap_inner
self.run()
File "/usr/local/lib/python2.7/threading.py", line 504, in run
self.__target(*self.__args, **self.__kwargs)
TypeError: ben() takes exactly 1 argument (18 given)
这是我的问题。这是什么错误?
TypeError: ben() takes exactly 1 argument (18 given)
答案 0 :(得分:14)
args
的{{1}}参数需要一个序列,但是你提供了一个字符串。这导致它将字符串的每个字母解释为单个参数,导致目标函数的参数太多。
你非常接近拥有正确的代码。您只需要通过在父级中添加一个尾随逗号来修复元组语法:
threading.Thread
答案 1 :(得分:0)
出于某种原因,您似乎将字符列表作为参数而不是字符串传递。
我得到了原因blender有7个字母,你传递了Type 7错误参数。而blender-softwaregl有18个字母,所以你有18个参数的Type错误而不是一个。
如果要将多个参数传递给子进程。 Popen,尝试使用变量名称fill和值列表传递字典。
def ben(fil):
pr = sub.Popen(fil,stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = pr.communicate()
print output
d = {'fil':['command1', 'command2']}
ben(**d)
还有一件事。如果打开子进程,为什么要打开一个线程??? 子进程是一个单独的进程,你不需要线程部分。我想你的代码将在没有线程部分的情况下工作。