Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Popen error: [Errno 2] No such file or directory

I have some custom commands.

This works:

subprocess.Popen(['python'], stdout=subprocess.PIPE)

But if I have my own system commands like deactivate, I get that error

Traceback (most recent call last):
  File "runner2.py", line 21, in <module>
    main() 
  File "runner2.py", line 18, in main
    subprocess.Popen(['deactivate',], stdout=subprocess.PIPE)
  File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Let alone I need to execute this under my sandbox virtualenv.

like image 996
user1012451 Avatar asked Oct 16 '22 07:10

user1012451


2 Answers

Try add an extra parameter shell=True to the Popen call.

like image 139
Anthony Kong Avatar answered Oct 18 '22 20:10

Anthony Kong


Just a note. shell=True was likely the correct solution to the o.p., since they did not make the following mistake, but you can also get the "No such file or directory" error if you do not split up your executable from its arguments.

import subprocess as sp, shlex
sp.Popen(['echo 1']) # FAILS with "No such file or directory"
sp.Popen(['echo', '1']) # SUCCEEDS
sp.Popen(['echo 1'], shell=True) # SUCCEEDS, but extra overhead
sp.Popen(shlex.split('echo 1')) # SUCCEEDS, equivalent to #2

Without shell=True, Popen expects the executable to be the first element of args, which is why it fails, there is no "echo 1" executable. Adding shell=True invokes your system shell and passes the first element of args to the shell. i.e. for linux, Popen(['echo 1'], shell=True) is equivalent to Popen('/bin/sh', '-c', 'echo 1') which is more overhead than you may need. See Popen() documentation for cases when shell=True is actually useful.

like image 57
Mark Woodward Avatar answered Oct 18 '22 21:10

Mark Woodward