subprocess checkouput OSError:[Errno 2]没有这样的文件或目录

时间:2018-02-13 16:20:07

标签: python linux python-2.7 subprocess

以下是示例代码:

def visit_Expr(self, node):
    # stand-alone call to a single name is to be removed
    if isinstance(node.value, ast.Call) and isinstance(node.value.func, ast.Name):
        return None
    return node

获取dh -h值list1的错误。

from subprocess import check_output
list1 = ['df', 'df -h']
for x in list1:
    output = check_output([x])

在python2.7中读取linux命令输出的最佳方法是什么

3 个答案:

答案 0 :(得分:2)

您应该提供check_output个参数作为列表。 这有效:

from subprocess import check_output
list1 = ['df', 'df -h']
for x in list1:
    output = check_output(x.split())

答案 1 :(得分:0)

我推荐kennethreitz编写的delegator和他的软件包https://github.com/kennethreitz/delegator.py,您可以这样做,API和输出都更清晰:

import delegator

cmds = ['df', 'df -h']
for cmd in cmds:
    p = delegator.run(cmd)
    print(p.out)

答案 2 :(得分:0)

对于传递cmdargs的方式,这种情况有几种选择:

# a list broken into individual parts, can be passed with `shell=False
['cmd', 'arg1', 'arg2', ... ]
# a string with just a `cmd`, can be passed with `shell=False`
'cmd`
# a string with a `cmd` and `args` 
# can only be passed to subprocess functions with `shell=True`
'cmd arg1 arg2 ...'

只是跟进marii的回答。 python.org上的subprocess docs有关于为什么的更多信息,您可能想要选择其中一个选项。

  所有呼叫都需要

args应该是字符串或序列   程序参数。通常提供一系列论证   首选,因为它允许模块处理任何所需的   转义和引用参数(例如,允许文件中的空格   名称)即可。如果传递单个字符串,则shell必须为True(请参阅   或者字符串必须简单地命名要执行的程序   没有指定任何参数。

(已添加摘要)

虽然添加shell=True可以做到这一点,但建议避免,因为将'df -h'更改为['df', '-h']并不是很困难,并且只是进入的良好习惯,如果你真的需要使用shell。正如文档也添加,对红色背景一样,

  

警告即可。   执行包含来自的unsanitized输入的shell命令   不受信任的来源使程序容易受到 shell注入,a   严重的安全漏洞,可导致任意命令执行。   出于这个原因,强烈建议不要使用shell=True   命令字符串由外部输入

构造的情况