プロセスのターゲット関数に文字列引数を渡そうとしています。どういうわけか、文字列は文字数と同じ数の引数のリストとして解釈されます。
これはコードです:
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)
>>>
何が悪いのですか? stringnを渡すにはどうすればよいですか?
ありがとう、アリエル
これはPythonの一般的な問題です。要素が1つだけのタプルが必要な場合は、それが実際にはタプルであることを指定する必要があります(括弧で囲まれたものだけではありません)。要素の後にコンマを追加することによって行われます。
これを修正するには、角括弧内の文字列の後にカンマを挿入します。
p = multiprocessing.Process(target=write, args=('hello',))
そうすることで、Pythonは、意図したとおり、それを単一の要素を持つタプルとして認識します。現在、Pythonは、コードを単なる文字列として解釈しています。ただし、文字列は事実上文字のリストであるため、この特定の方法で失敗しています。したがって、Pythonは、( 'h'、 'e'、 'l'、 'l'、 'o')。それが「あなたが私に5つのパラメータを与えた」と言っている理由です。
args=('hello')
をargs=('hello',)
またはそれ以上に変更args=['hello']
。それ以外の場合、括弧はシーケンスを形成しません。
あなたはパスする必要があります
p = multiprocessing.Process(target=write, args=('hello',))
コンマに注意してください!それ以外の場合は、1要素のタプルとしてではなく、単純な文字列として解釈されます。