Search code examples
pythonpopen

python: raise child_exception, OSError: [Errno 2] No such file or directory


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?


Solution

  • 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 the shell=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:

    import shlex
    omp_cmd = 'omp -h %s -u %s -w %s -p %s -X %s' \
    %(self.host_IP, self.username, self.password, self.port, temp_xml)
    xmlResult = Popen(shlex.split(omp_cmd), stdout=PIPE, stderr=STDOUT)
    

    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:

    import shlex
    omp_cmd = 'omp -h %s -u %s -w %s -p %s -X -' \
    %(self.host_IP, self.username, self.password)
    with open(temp_xml) as stdin:
        xmlResult = Popen(shlex.split(omp_cmd), stdin=stdin, 
        stdout=PIPE, stderr=STDOUT)