2009-10-13 9 views
21

Próbuję przekazać argument łańcuchowy do funkcji docelowej w procesie. W jakiś sposób ciąg jest interpretowany jako lista tak wielu argumentów, jak są znaki.Argumenty łańcuchowe w procesie wieloprocesorowym Pythona

Jest to kod:

import multiprocessing 

def write(s): 
    print s 

write('hello') 

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

p.start() 

uzyskać ten wynik:

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) 

>>> 

Co robię źle? Jak mam przekazać ciąg?

Dzięki Ariel

Odpowiedz

51

To jest typowe hasło w Pythonie - jeśli chcesz mieć krotkę z jednym elementem, musisz określić, że jest to faktycznie krotka (a nie tylko coś z nawiasami) - można to zrobić, dodając przecinek po elemencie.

Aby rozwiązać ten problem, wystarczy umieścić przecinek po łańcuchu, w nawiasie:

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

ten sposób, Python rozpozna go jako krotki z jednego elementu, zgodnie z przeznaczeniem. Obecnie Python interpretuje twój kod jako tylko ciąg znaków. Jednak w tym szczególny sposób ulega awarii, ponieważ łańcuch jest efektywną listą znaków. Tak więc Python myśli, że chcesz przekazać ("h", "e", "l", "l", "o"). Właśnie dlatego mówi "dałeś mi 5 parametrów".

2

Trzeba zdać

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

Zawiadomienie przecinek! W przeciwnym razie jest interpretowany jako prosty ciąg znaków, a nie jako 1 elementowa krotka.

6

Zmień args=('hello') na args=('hello',) lub jeszcze lepiej args=['hello']. W przeciwnym razie nawiasy nie tworzą sekwencji.

Powiązane problemy