8

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

2 回答 2

18

args参数threading.Thread需要一个序列,但您提供的是一个字符串。这导致它将字符串的每个字母解释为单独的参数,从而导致目标函数的参数过多。

您非常接近拥有正确的代码。您只需要通过在括号中添加尾随逗号来修复您的元组语法:

tr = threading.Thread(target=ben, args=(u,)) # comma makes args into a 1-tuple
于 2012-12-18T21:21:53.750 回答
0

出于某种原因,您似乎将字符列表作为参数而不是字符串传递。

我明白了,因为搅拌机有 7 个字母,而您通过了类型错误 7 个参数。Blender-softwaregl 有 18 个字母,所以你有 18 个参数的类型错误,而不是一个。

如果您想将多个参数传递给子进程。Popen,尝试使用变量名填充和值列表传递字典。

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)

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

于 2012-12-18T13:32:51.540 回答