如何将单个字符串的元组作为参数传递(例如,给multiprocessing.Process)?

52 投票
3 回答
65282 浏览
提问于 2025-04-15 15:02

我正在尝试把一个字符串作为参数传递给一个进程中的目标函数。但是,不知道为什么,这个字符串被当作一个字符列表来处理,变成了很多个参数。

这是我的代码:

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个参数”。

撰写回答