2009-10-13 13 views
21

Ich versuche, ein String-Argument an eine Zielfunktion in einem Prozess übergeben. Irgendwie wird die Zeichenfolge als eine Liste von so vielen Argumenten interpretiert, wie es Zeichen gibt.String Argumente in Python Multiprocessing

Dies ist der Code:

import multiprocessing 

def write(s): 
    print s 

write('hello') 

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

p.start() 

ich diese Ausgabe erhalten:

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) 

>>> 

Was mache ich falsch? Wie soll ich einen Stringn weitergeben?

Danke, Ariel

Antwort

51

Dies ist eine häufige Sache in Python - wenn Sie ein Tupel mit nur einem Element haben wollen, müssen Sie angeben, dass es tatsächlich ein Tupel ist (und nicht nur etwas mit Klammern) - dies geschieht durch Hinzufügen von Komma nach dem Element.

Um dies zu beheben, setzen Sie einfach ein Komma nach der Zeichenfolge, in den Klammern:

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

Auf diese Weise Python es als ein Tupel mit einem einzelnen Elemente erkennen, wie beabsichtigt. Derzeit interpretiert Python Ihren Code nur als Zeichenfolge. Es scheitert jedoch auf diese besondere Art und Weise, da eine Zeichenkette tatsächlich eine Liste von Zeichen ist. Also denkt Python, dass du gehen willst ('h', 'e', ​​'l', 'l', 'o'). Deshalb heißt es "Du hast mir 5 Parameter gegeben".

2

Sie haben

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

Beachten Sie das Komma zu übergeben! Andernfalls wird es als einfache Zeichenfolge und nicht als 1-Element-Tupel interpretiert.

6

Ändern args=('hello') zu args=('hello',) oder noch besser args=['hello']. Andernfalls bilden Klammern keine Sequenz.