web-dev-qa-db-ja.com

python multiprocessingの文字列引数

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

これはコードです:

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を渡すにはどうすればよいですか?

ありがとう、アリエル

34
abalter

これはPythonの一般的な問題です。要素が1つだけのタプルが必要な場合は、それが実際にはタプルであることを指定する必要があります(括弧で囲まれたものだけではありません)。要素の後にコンマを追加することによって行われます。

これを修正するには、角括弧内の文字列の後にカンマを挿入します。

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

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

86
Smashery

args=('hello')args=('hello',)またはそれ以上に変更args=['hello']。それ以外の場合、括弧はシーケンスを形成しません。

11
Denis Otkidach

あなたはパスする必要があります

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

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

6
pygabriel