【问题标题】:python: raise child_exception, OSError: [Errno 2] No such file or directorypython: raise child_exception, OSError: [Errno 2] 没有这样的文件或目录
【发布时间】:2012-07-18 23:59:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: python popen


    【解决方案1】:

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

    我对@9​​87654323@ 命令不是特别熟悉,但这闻起来很像无用的猫。我认为实现这一目标的更好方法是:

    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)
    

    【讨论】:

    • 你是对的!!还有一个问题,如果 shell=False,args 应该是一个列表,对吗?这两种方式有什么区别?
    • 回答你的问题,我存储在文件中的那个命令有 9000 行长,我的操作系统会给我“arg list too long error”:)
    • @da_zhuang -- 是的,对于shell=False,参数通常是一个列表。我使用了shlex.split 函数,它接受一个字符串并将其拆分为一个列表,就像典型的shell 一样。使用shell=True,您传递一个字符串,该字符串由shell 评估。使用 shell=False 传递一个字符串或一个列表。如果是字符串,则将其评估为好像它是唯一的命令。 ("ls -l" 会失败,因为没有命令ls -l,只有ls)。如果是列表,则将每个元素作为参数。 ["ls", "-l"]
    • @da_zhuang -- 我编辑的版本保留了标准输入的原始读数,但仍然消除了对cat 的依赖,因此需要使用shell=Trueshell=True 的问题在于,如果给出不受信任的输入,它很容易受到 shell 注入的攻击。 (比如self.host_IP 不知何故被赋值为"; rm -rf ~;"
    【解决方案2】:

    tox 脚本也发生了这个错误,结果证明 virtualenv 是用 tox 创建的,它的绝对路径长度约为 96 个字符,但每当它使你的绝对“bin/pip”路径接近 123 chars,出现调用错误,OSError2。

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

    Python:Python 2.7.6 虚拟环境:15.1.0 毒物:2.9.1 点数:9.0.1 Ubuntu 14.04 测试覆盖率:django(1.8-1.11) 分别使用 py27、py35 进行测试

    分辨率: 我首先在安装 tox 的地方创建了我的 virtualenv(带有 abs 路径

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      相关资源
      最近更新 更多