web-dev-qa-db-fra.com

Python Arguments de chaîne de filetage

J'ai un problème avec Python enfiler et envoyer une chaîne dans les arguments.

def processLine(line) :
    print "hello";
    return;

.

dRecieved = connFile.readline();
processThread = threading.Thread(target=processLine, args=(dRecieved));
processThread.start();

Où dRecieved est la chaîne d'une ligne lue par une connexion. Il appelle une fonction simple qui n’a pour l’instant qu’une tâche d’impression "hello".

Cependant j'obtiens l'erreur suivante

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 est la longueur de la chaîne que j'essaie de passer, alors je suppose qu'elle la divise en chaque caractère et essaye de passer les arguments comme ça. Cela fonctionne bien si j'appelle la fonction normalement mais je voudrais vraiment la configurer comme un thread séparé.

128
Anonymous

Vous essayez de créer un tuple, mais vous ne faites que mettre entre parenthèses une chaîne :)

Ajouter un extra ',':

dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=(dRecieved,))  # <- note extra ','
processThread.start()

Ou utilisez des crochets pour faire une liste:

dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=[dRecieved])  # <- 1 element list
processThread.start()

Si vous remarquez, à partir de la trace de la pile: self.__target(*self.__args, **self.__kwargs)

Le *self.__args Transforme votre chaîne en une liste de caractères, en les transmettant à la fonction processLine. Si vous lui transmettez une liste à un élément, il passera cet élément en tant que premier argument - dans votre cas, la chaîne.

248
Stephen