web-dev-qa-db-ja.com

Pythonスレッド文字列引数

Pythonのスレッド化と引数の文字列の送信に問題があります。

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

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

DRecievedは、接続によって読み取られる1行の文字列です。現時点では、「hello」を印刷するジョブが1つしかない単純な関数を呼び出します。

ただし、次のエラーが表示されます

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は私が渡そうとしている文字列の長さなので、それを各文字に分割し、そのような引数を渡そうとしていると思います。普通に関数を呼び出すだけでうまくいきますが、別のスレッドとして設定したいのです。

128
Anonymous

タプルを作成しようとしていますが、文字列を括弧で囲んでいるだけです:)

追加の「、」を追加します。

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関数に渡します。 1つの要素のリストを渡すと、その要素を最初の引数として(あなたの場合は文字列として)渡します。

248
Stephen