Python 线程字符串参数

新手上路,请多包涵

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

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

.

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

其中 dRecieved 是连接读取的一行字符串。它调用了一个简单的函数,该函数目前只有一个打印“hello”的工作。

但是我收到以下错误

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

原文由 Anonymous 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 638
2 个回答

您正在尝试创建一个元组,但您只是在括号中加上了一个字符串 :)

添加一个额外的’,’:

 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 函数。如果您将一个元素列表传递给它,它将将该元素作为第一个参数传递——在您的例子中是字符串。

原文由 Stephen 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

首先,方法 threading::Thread 的构造函数签名:

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

args 是目标调用的参数 元组。默认为 ()。

其次,Python 中关于 tuple 的一个 怪癖

空元组由一对空括号构成; 包含一个项目的元组 是通过在值后跟一个 逗号 来构造的(将单个值括在括号中是不够的)。

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

然而,Python 是如此集成,不像 JavaScript 那样可以容忍额外的参数。相反,它抛出一个 TypeError 来抱怨。

原文由 themefield 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题