python:raise child_exception,OSError:[Errno 2]没有这样的文件或目录

时间:2012-07-19 18:19:46

标签: python popen

我使用subprocess.popen()函数在python中执行命令,如下所示:

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)

在shell中运行良好且没有错误,但在python中我得到:

  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

我搜索了错误,但没有一个解决了我的问题。有谁知道这个问题的原因是什么?感谢。

2 个答案:

答案 0 :(得分:22)

如果您要将该命令作为字符串传递给Popen,并且如果命令中包含其他命令的管道,则需要使用shell=True关键字。

我对omp命令并不是特别熟悉,但这有点像无用的猫一样。我认为更好的方法是:

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)

或者,如果它不是无用的cat(你真的需要通过stdin管道文件),你也可以用子进程来做到这一点:

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)

答案 1 :(得分:0)

对于我来说,使用tox脚本也出现了这个错误,结果发现virtualenv是用tox创建的,它有一个长度大约为96个字符的asolute路径但是只要你的绝对'bin / pip'路径接近123左右chars,有一个调用错误,OSError2。

'错误:调用失败(错误2), OSError:[Errno 2]没有这样的文件或目录'

Python:Python 2.7.6 的virtualenv:15.1.0 tox:2.9.1 点数:9.0.1 ubuntu 14.04 测试运行覆盖:django(1.8-1.11)测试py27,py35每个

分辨率: 我创建了我的virtualenv(使用abs路径< =(96-100)字符),首先安装了tox,克隆了我的项目以便与此tox安装和virtualenv一起使用,tox现在创建它自己的virtualenvs并运行正常。

希望它有所帮助。