views:

270

answers:

3

I'm trying to pass a string argument to a target function in a process. Somehow, the string is interpreted as a list of as many arguments as there are characters.

This is the code:

import multiprocessing

def write(s):
   print s

write('hello')

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

p.start()

I get this output:

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)

>>>

What am I doing wrong? How am I supposed to pass a stringn?

Thanks, Ariel

+1  A: 

You have to pass p = multiprocessing.Process(target=write, args=('hello',))

Notice the comma! Otherwise it is interpreted as a simple string and not as a 1 element tuple.

pygabriel
+1  A: 

Change args=('hello') to args=('hello',) or even better args=['hello']. Otherwise parentheses don't form a sequence.

Denis Otkidach
Thanks much to all responders!
abalter
+10  A: 

This is a common gotcha in Python - if you want to have a tuple with only one element, you need to specify that it's actually a tuple (and not just something with brackets around it) - this is done by adding a comma after the element.

To fix this, just put a comma at the end of your tuple:

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

That way, Python will recognise it as a tuple, as intended. Currently, Python is interpreting your code as just a string. However, it's not failing, because a string is effectively list of characters. So Python is thinking that you want to pass ('h', 'e', 'l', 'l', 'o'). That's why it's saying "you gave me 5 parameters".

Smashery