2009-10-13 5 views
21

J'essaie de transmettre un argument chaîne à une fonction cible dans un processus. D'une certaine façon, la chaîne est interprétée comme une liste d'autant d'arguments qu'il y a de caractères.Arguments de chaîne en multiprocesseur python

Voici le code:

import multiprocessing 

def write(s): 
    print s 

write('hello') 

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

p.start() 

Je reçois cette sortie:

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) 

>>> 

Qu'est-ce que je fais mal? Comment suis-je censé passer un stringn?

Merci, Ariel

Répondre

51

Ceci est un gotcha commun en Python - si vous voulez avoir un tuple avec un seul élément, vous devez spécifier qu'il s'agit en fait d'un tuple (et pas seulement quelque chose avec des parenthèses autour) - ceci est fait en ajoutant un virgule après l'élément.

Pour résoudre ce problème, il suffit de mettre une virgule après la chaîne, à l'intérieur des supports:

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

De cette façon, Python reconnaîtra comme un tuple avec un seul élément, comme prévu. Actuellement, Python interprète votre code comme une simple chaîne de caractères. Cependant, il échoue de cette façon particulière car une chaîne est effectivement une liste de caractères. Alors Python pense que vous voulez passer ('h', 'e', ​​'l', 'l', 'o'). C'est pourquoi il dit "vous m'avez donné 5 paramètres".

2

Vous devez passer

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

Notez la virgule! Sinon, il est interprété comme une chaîne simple et non comme un tuple à 1 élément.

6

Remplacez args=('hello') par args=('hello',) ou mieux args=['hello']. Sinon, les parenthèses ne forment pas une séquence.

Questions connexes