Pythonスレッディング文字列引数


156

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は、渡そうとしている文字列の長さです。そのため、文字列ごとに分割して、そのような引数を渡そうとしていると思います。通常は関数を呼び出すだけで問題ありませんが、別のスレッドとして設定したいのですが。


49
なぜ各行の終わりにセミコロンがあるのですか?
Maikflow 2015

@Maikflowそれは良い習慣ではありませんか?ASIは、セミコロンではない行をバックグラウンドでセミコロンに変換します。
IK

@IK参照してください。このstackoverflow.com/questions/19365508/...
Maikflow

回答:


296

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

余分な「、」を追加します。

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つの要素のリストを渡すと、その要素が最初の引数として渡されます。この場合は文字列です。


1
2番目のコードブロックの行2の終わりに余分な括弧があります。私はそれを編集したかったのですが、それは6文字未満です
ハーモニック

デフォルト値のarg2がある場合は、これを実行します。threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
DeveScie

8

ここで、より多くの背景知識を提供したいと思います。

最初に、メソッドthreading :: Threadのコンストラクタ署名:

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

argsは、ターゲット呼び出しの引数タプルです。デフォルトは()です。

第二に、Python のtuple

空のタプルは、括弧の空のペアで構成されます。1つの項目を持つタプルは、値の後にコンマを付けて構成されます(単一の値を括弧で囲むだけでは不十分です)。

一方、文字列はのような一連の文字'abc'[1] == 'b'です。したがって、文字列をargsに、括弧内(依然としてであっても、各文字は1つのパラメータとして扱われます。

ただし、Pythonは非常に統合されており、追加の引数を許容できるJavaScriptとは異なります。代わりに、TypeError文句を言うためにをスローします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.