python线程应用程序错误到许多参数

时间:2012-12-18 12:13:29

标签: python multithreading python-2.7

这个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)

2 个答案:

答案 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)

还有一件事。如果打开子进程,为什么要打开一个线程??? 子进程是一个单独的进程,你不需要线程部分。我想你的代码将在没有线程部分的情况下工作。