Строковые аргументы в многопроцессорной обработке Python - PullRequest
32 голосов
/ 13 октября 2009

Я пытаюсь передать строковый аргумент целевой функции в процессе. Почему-то строка интерпретируется как список из столько аргументов, сколько есть символов.

Это код:

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 ]

75 голосов
/ 13 октября 2009

Это распространенная ошибка в Python - если вы хотите иметь кортеж только с одним элементом, вам нужно указать, что это на самом деле кортеж (а не просто что-то с круглыми скобками) - это делается путем добавления запятой после элемента.

Чтобы это исправить, просто поставьте запятую после строки в скобках:

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

Таким образом, Python распознает его как кортеж с одним элементом, как и предполагалось. В настоящее время Python интерпретирует ваш код как просто строку. Однако, это терпит неудачу в этом конкретном способе, потому что строка - фактически список символов. Итак, Python думает, что вы хотите передать ('h', 'e', ​​'l', 'l', 'o'). Вот почему он говорит: «Вы дали мне 5 параметров».

10 голосов
/ 13 октября 2009

Измените args=('hello') на args=('hello',) или даже лучше args=['hello']. В противном случае скобки не образуют последовательность.

6 голосов
/ 13 октября 2009

Вы должны пройти

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

Обратите внимание на запятую! В противном случае он интерпретируется как простая строка, а не как кортеж из 1 элемента.

...