¿Por qué una cadena entre paréntesis no forma una tupla solo con esa cadena? [duplicar]
Tengo un problema con el subprocesamiento de Python y el envío de una cadena en los argumentos.
def processLine(line) :
print "hello";
return;
.
dRecieved = connFile.readline();
processThread = threading.Thread(target=processLine, args=(dRecieved));
processThread.start();
Donde dRecieved es la cadena de una línea leída por una conexión. Llama a una función simple que a partir de ahora solo tiene un trabajo de imprimir "hola".
Sin embargo me sale el siguiente error
Traceback (most recent call last):
File "C:\Python25\lib\threading.py", line 486, in __bootstrap_inner
self.run()
File "C:\Python25\lib\threading.py", line 446, in run
self.__target(*self.__args, **self.__kwargs)
TypeError: processLine() takes exactly 1 arguments (232 given)
232 es la longitud de la cadena que estoy tratando de pasar, así que supongo que la dividiremos en cada carácter y trataremos de pasar los argumentos de esa manera. Funciona bien si llamo a la función normalmente, pero realmente me gustaría configurarla como un hilo separado.
Estás intentando crear una tupla, pero solo estás entre paréntesis en una cadena :)
Agregue un ',' adicional:
dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=(dRecieved,)) # <- note extra ','
processThread.start()
O use corchetes para hacer una lista:
dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=[dRecieved]) # <- 1 element list
processThread.start()
Si te fijas, desde el seguimiento de la pila:self.__target(*self.__args, **self.__kwargs)
Convierte *self.__args
tu cadena en una lista de caracteres y los pasa a la processLine
función. Si le pasa una lista de un elemento, pasará ese elemento como primer argumento (en su caso, la cadena).
from threading import Thread
from time import sleep
def run(name):
for x in range(10):
print("helo "+name)
sleep(1)
def run1():
for x in range(10):
print("hi")
sleep(1)
T=Thread(target=run,args=("Ayla",))
T1=Thread(target=run1)
T.start()
sleep(0.2)
T1.start()
T.join()
T1.join()
print("Bye")