20

我使用 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

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

4

2 回答 2

25

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

我对这个omp命令不是特别熟悉,但这闻起来很像对 cat 的无用使用。我认为实现这一目标的更好方法是:

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 输入文件),您也可以使用 subprocess 来做到这一点:

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)
于 2012-07-19T18:21:07.467 回答
0

这个错误也发生在我的 tox 脚本中,结果证明 virtualenv 是用 tox 创建的,它有一个绝对路径,长度约为 96 个字符,但每当它把你的绝对“bin/pip”路径接近大约 123 个字符时,那里是一个调用错误,OSError2。

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

Python:Python 2.7.6 virtualenv:15.1.0 tox:2.9.1 pip:9.0.1 ubuntu 14.04 测试运行覆盖:django(1.8-1.11) 分别使用 py27、py35 进行测试

解决方案:我首先在安装 tox 的地方创建了我的 virtualenv(带有 abs 路径 <=(96-100)字符),克隆了我的项目以用于此 tox 安装和 virtualenv,tox 现在创建了它自己的 virtualenvs,它运行良好。

希望能帮助到你。

于 2017-11-19T20:57:43.660 回答