How can I pass a tuple with a single string as an argument (e.g. to mulitprocessing.Process)?
Question:
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 string?
Answers:
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.
Change args=('hello')
to args=('hello',)
or even better args=['hello']
. Otherwise parentheses don’t form a sequence.
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 after the string, inside the brackets:
p = multiprocessing.Process(target=write, args=('hello',))
That way, Python will recognise it as a tuple with a single element, as intended. Currently, Python is interpreting your code as just a string. However, it’s failing in this particular way 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”.
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 string?
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.
Change args=('hello')
to args=('hello',)
or even better args=['hello']
. Otherwise parentheses don’t form a sequence.
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 after the string, inside the brackets:
p = multiprocessing.Process(target=write, args=('hello',))
That way, Python will recognise it as a tuple with a single element, as intended. Currently, Python is interpreting your code as just a string. However, it’s failing in this particular way 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”.