47

我正在尝试将字符串参数传递给进程中的目标函数。不知何故,字符串被解释为与字符一样多的参数列表。

这是代码:

import multiprocessing

def write(s):
   print s

write('hello')

p = multiprocessing.Process(target=write, args=('hello'))

p.start()

我得到这个输出:

hello
Process Process-1:
Traceback (most recent call last):
>>>   File "/usr/local/lib/python2.5/site-packages/multiprocessing/process.py", line 237, in _bootstrap
    self.run()
  File "/usr/local/lib/python2.5/site-packages/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
TypeError: write() takes exactly 1 argument (5 given)

>>>

我究竟做错了什么?我应该如何通过一个字符串?

谢谢,爱丽儿

4

3 回答 3

125

这是 Python 中的一个常见问题——如果你想要一个只有一个元素的元组,你需要指定它实际上是一个元组(而不仅仅是用括号括起来的东西)——这是通过在元素后添加一个逗号来完成的.

要解决此问题,只需在括号内的字符串后加一个逗号:

p = multiprocessing.Process(target=write, args=('hello',))

这样,Python 将按照预期将其识别为具有单个元素的元组。目前,Python 将您的代码解释为只是一个字符串。但是,它以这种特殊方式失败了,因为字符串实际上是字符列表。所以Python认为你想通过('h','e','l','l','o')。这就是为什么它说“你给了我 5 个参数”。

于 2009-10-13T09:33:44.000 回答
15

args=('hello')args=('hello',)甚至更好args=['hello']。否则括号不会形成序列。

于 2009-10-13T09:32:46.650 回答
11

你必须通过

p = multiprocessing.Process(target=write, args=('hello',))

注意逗号!否则,它被解释为一个简单的字符串,而不是一个 1 元素元组。

于 2009-10-13T09:32:23.593 回答