Подтвердить что ты не робот

Строковые аргументы в многопроцессорности python

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

Это код:

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)

>>>

Что я делаю неправильно? Как я могу передать stringn?

Спасибо, Ариэль

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

Вам нужно пройти

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

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