¿Por qué una cadena entre paréntesis no forma una tupla solo con esa cadena? [duplicar]

Resuelto Anonymous asked hace 14 años • 3 respuestas

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.

Anonymous avatar Jul 11 '10 09:07 Anonymous
Aceptado

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.__argstu 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).

Stephen avatar Jul 11 '2010 02:07 Stephen
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")
HASEEB ALI avatar Dec 29 '2020 03:12 HASEEB ALI