I execute a command in python using subprocess.popen() function like the following:
omp_cmd = 'cat %s | omp -h %s -u %s -w %s -p %s -X -' %(temp_xml, self.host_IP, self.username, self.password, self.port)
xmlResult = Popen(omp_cmd, stdout=PIPE, stderr=STDOUT)
In the shell it runs fine without error, but in python I get:
File "/home/project/vrm/apps/audit/models.py", line 148, in sendOMP
xmlResult = Popen(omp_cmd, stdout=PIPE, stderr=STDOUT)
File "/usr/local/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/local/lib/python2.7/subprocess.py", line 1228, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
I searched the error but none of them solved my problem. Does anyone know what's the cause of this issue? Thanks.
This error has also occured for me too with tox scripts, turns out that a virtualenv is created with tox which has an asolute path with length about 96 characters but whenever it takes your absolute 'bin/pip' path to near about 123 chars, there is an invocation error, OSError2.
'ERROR: invocation failed (errno 2), OSError: [Errno 2] No such file or directory'
Python: Python 2.7.6 virtualenv:15.1.0 tox: 2.9.1 pip: 9.0.1 ubuntu 14.04 test ran with coverage: django(1.8-1.11) tests with py27, py35 each
Resolution: I created my virtualenv(with abs path <=(96-100) chars) first where tox is installed, cloned my project to be used with this tox installation and virtualenv, tox creates it own virtualenvs now and it runs fine.
hope it helps.
If you're going to pass the command as a string to
Popen
and if the commands have pipes to other commands in there, you need to use theshell=True
keyword.I'm not particularly familiar with the
omp
command, but this smells an awful lot like a useless use of cat. I would think that a better way to achieve this would be to:Or, if it's not a useless use of cat (You really do need to pipe the file in via stdin), you can do that with subprocess too: