如何将单个字符串的元组作为参数传递(例如,给multiprocessing.Process)?
我正在尝试把一个字符串作为参数传递给一个进程中的目标函数。但是,不知道为什么,这个字符串被当作一个字符列表来处理,变成了很多个参数。
这是我的代码:
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)
>>>
我哪里出错了?我应该怎么正确传递一个字符串呢?
3 个回答
11
你需要传递
p = multiprocessing.Process(target=write, args=('hello',))
注意那个逗号!否则它会被当作一个普通的字符串,而不是一个包含一个元素的元组。
16
把 args=('hello')
改成 args=('hello',)
,或者更好的是 args=['hello']
。否则,括号里的内容就不会被当作一个序列来处理。
144
在Python中,有一个常见的误区。如果你想创建一个只有一个元素的元组,你需要明确告诉Python这是一个元组,而不是仅仅用括号包裹的东西。要做到这一点,你需要在元素后面加一个逗号。
解决这个问题的方法就是在字符串后面加一个逗号,放在括号里:
p = multiprocessing.Process(target=write, args=('hello',))
这样,Python就会把它识别为一个包含单个元素的元组,正如你所期望的那样。目前,Python把你的代码当作一个字符串来理解。但是,它之所以这样处理,是因为字符串实际上是字符的列表。所以,Python认为你想传递的是 ('h', 'e', 'l', 'l', 'o')。这就是为什么它会说“你给了我5个参数”。