2009-10-13 8 views
21

文字列引数をプロセス内のターゲット関数に渡そうとしています。どういうわけか、文字列は文字数と同じ数の引数のリストとして解釈されます。Pythonマルチプロセッシングの文字列引数

これはコードです:

import multiprocessing 

def write(s): 
    print s 

write('hello') 

p = multiprocessing.Process(target=write, args=('hello')) 

p.start() 

私はこの出力を得る:

hello 
Process Process-1: 
Traceback (most recent call last): 
>>> File "/usr/local/lib/python2.5/site-packages/multiprocessing/process.py", line 237, in _bootstrap 
    self.run() 
    File "/usr/local/lib/python2.5/site-packages/multiprocessing/process.py", line 93, in run 
    self._target(*self._args, **self._kwargs) 
TypeError: write() takes exactly 1 argument (5 given) 

>>> 

は私が間違って何をしているのですか?どのように文字列を渡す必要がありますか?あなたは

p = multiprocessing.Process(target=write, args=('hello',)) 

を渡す必要が

おかげで、アリエル

答えて

51

これはPythonでよく見られる問題です。要素が1つしかないタプルを使用する場合は、実際にはタプルであることを指定する必要があります。要素の後ろにカンマ。ただカッコ内の文字列の後にコンマを入れて、この問題を解決するには

p = multiprocessing.Process(target=write, args=('hello',)) 

そのように、Pythonは意図したように、単一の要素を持つタプルとしてそれを認識します。現在のところ、Pythonはコードを単なる文字列として解釈しています。しかし、文字列は事実上文字のリストであるため、この特定の方法では失敗します。だから、Pythonはあなたが渡したいと思っている( 'h'、 'e'、 'l'、 'l'、 'o')。だから、「あなたは5つのパラメータをくれました」と言っているのです。

2

はカンマを注意してください!それ以外の場合は、単純な文字列として解釈され、1要素タプルとして解釈されません。

6

args=('hello')からargs=('hello',)まで、またはそれ以上の場合はargs=['hello']に変更してください。それ以外の場合、かっこはシーケンスを形成しません。

関連する問題