Python线程字符串参数

我在使用Python线程并在参数中发送字符串时遇到了问题。

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

.

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

其中,DRECIEVED是连接读取的一行的字符串。它调用了一个简单的函数,该函数目前只有一个打印任务。你好";。

但是,我得到以下错误

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是我试图传递的字符串的长度,所以我猜它把它分解成每个字符,并试图传递这样的参数。如果我只是正常调用函数,它工作得很好,但我真的想把它设置为一个单独的线程。

346580 次浏览

您正在尝试创建一个元组,但您只是将一个字符串括起来:)

添加额外的“,”:

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

或者用括号列一个清单:

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

如果您注意到,在堆栈跟踪中:self.__target(*self.__args, **self.__kwargs)

*self.__args将字符串转换为字符列表,并将它们传递给processLine 功能。如果您向它传递一个元素列表,它将把该元素作为第一个参数传递-在您的示例中是字符串。

希望在这里提供更多的背景知识。

首先,方法的构造函数签名线程:线程

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

参数是目标调用的ABC__1__的参数。默认值为()。

第二,Python中关于tuple怪癖

空元组由一对空括号构成;包含一项的元组是通过在一个值后面加上逗号来构造的(只用括号括住一个值是不够的)。

另一方面,字符串是字符序列,如'abc'[1] == 'b'。因此,如果将字符串发送到args,即使在括号中(仍然是一个刺痛),每个字符都将被视为单个参数。

然而,Python是如此的集成,不像JavaScript那样可以容忍额外的参数。而是抛出TypeError进行投诉。

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")