47

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

これはコードです:

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

ありがとう、アリエル

4

3 に答える 3

125

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

これを修正するには、文字列の後にカンマを入れます:

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

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

于 2009-10-13T09:33:44.000 に答える
15

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

于 2009-10-13T09:32:46.650 に答える
11

あなたは合格しなければなりません

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

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

于 2009-10-13T09:32:23.593 に答える