当我只是回显一个字符串时,如何调用suprocess.checkoutput()不返回任何内容

时间:2017-12-04 16:27:45

标签: python subprocess

在python中,我尝试运行一些命令,但是我无法使它工作,总结一下这个脚本应该通过subproscess执行四个简单命令,存储它们各自的输出然后显示它们。

#!/usr/bin/python
import subprocess

output_1 = None
output_2 = None
output_3 = None
output_4 = None

print "Start"
try:
    output_1 = subprocess.check_output(["ls", "-al"], shell=True, stderr=subprocess.STDOUT)
    output_2 = subprocess.check_output(["echo", "'Hi'"], shell=True, stderr=subprocess.STDOUT)
    output_3 = subprocess.check_output(["echo", "\"Hi\""], shell=True, stderr=subprocess.STDOUT)
    output_4 = subprocess.check_output(["echo", "Hi"], shell=True, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as ex:
    print "Command '%s' return exit code %s:\n\n%s" % (ex.cmd, ex.returncode, ex.output)

print "Out 1: '%s'" % output_1
print "Out 2: '%s'" % output_2
print "Out 3: '%s'" % output_3
print "Out 4: '%s'" % output_4

我不明白为什么我的输出中没有'Hi'...这是我得到的输出:

Start
Out 1: '
test
undefined10_error.png
undefined20_error.png
undefined35_error.png
undefined40_error.png
'
Out 2: '
'
Out 3: '
'
Out 4: '
'

1 个答案:

答案 0 :(得分:1)

传递shell=True参数you are telling the interpreter to execute the command as a single string。这意味着第一个参数需要是一个字符串。如果您查看第一个命令的输出,您会注意到您没有获得标记am,而只是标准ls

如果要使用shell=True,请将参数作为str:

传递
> subprocess.check_output("echo 'Hello World!'", shell=True, stderr=subprocess.STDOUT)
b'Hello World!\n'

如果您计划使用变量,则需要使用shelex.quote自行转义它们。

使用局部变量:

>>> import shlex
>>> local_variable = 'Hi \'world"'
>>> command = 'echo {}'.format(shlex.quote(local_variable))
>>> subprocess.check_output(command,shell=True, stderr=subprocess.STDOUT)
b'Hi \'world"\n'