Search code examples
pythonlinuxpython-2.7ubuntutext-to-speech

Python subprocess call throws error when writing file


I'd like to use SVOX/pico2wave to write a wav-file from Python code. When I execute this line from a terminal the file is written just fine:

/usr/bin/pico2wave -w=/tmp/tmp_say.wav "Hello world."

I've verified that pico2wave is located in /usr/bin.

This is my Python code:

from subprocess import call

call('/usr/bin/pico2wave -w=/tmp/tmp_say.wav "Hello world."')

... which throws this error:

Traceback (most recent call last):
  File "app/app.py", line 63, in <module>
    call('/usr/bin/pico2wave -w=/tmp/tmp_say.wav "Hello world."')
  File "/usr/lib/python2.7/subprocess.py", line 168, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 390, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1024, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Solution

  • From the documentation

    Providing a sequence of arguments is generally preferred, as it allows the module to take care of any required escaping and quoting of arguments (e.g. to permit spaces in file names). If passing a single string, either shell must be True (see below) or else the string must simply name the program to be executed without specifying any arguments.

    So you might try with

    call(['/usr/bin/pico2wave', '-w=/tmp/tmp_say.wav', '"Hello world."'])