2009-10-13 6 views
21

Estoy intentando pasar un argumento de cadena a una función de destino en un proceso. De alguna manera, la cadena se interpreta como una lista de tantos argumentos como caracteres hay.Argumentos de cadena en el multiproceso de python

Este es el código:

import multiprocessing 

def write(s): 
    print s 

write('hello') 

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

p.start() 

consigo esta salida:

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é estoy haciendo mal? ¿Cómo se supone que voy a pasar un stringn?

Gracias, Ariel

Respuesta

51

Esto es un problema común en Python: si desea tener una tupla con un solo elemento, debe especificar que en realidad es una tupla (y no solo algo con corchetes): esto se hace agregando un coma después del elemento.

Para solucionar esto, sólo hay que poner una coma después de la cadena, dentro de los corchetes:

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

De esa manera, Python lo reconocerá como una tupla con un solo elemento, como se pretende. Actualmente, Python está interpretando su código como solo una cadena. Sin embargo, está fallando de esta manera particular porque una cadena es efectivamente una lista de caracteres. Entonces Python está pensando que quieres pasar ('h', 'e', ​​'l', 'l', 'o'). Es por eso que está diciendo "me diste 5 parámetros".

2

usted tiene que pasar

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

Aviso de la coma! De lo contrario, se interpreta como una cadena simple y no como una tupla de 1 elemento.

6

Cambie args=('hello') a args=('hello',) o mejor args=['hello']. De lo contrario, los paréntesis no forman una secuencia.

Cuestiones relacionadas