Python不执行使用变量的shell命令

时间:2017-05-05 11:58:15

标签: python shell subprocess os.system

我正在尝试使用shell命令从中提取变量,我想在我的python程序的其余部分中使用它。例如,此代码尝试使用subprocess.callos.system。前者给我一个错误,而后者没有产生任何东西,而如果我在shell命令中不使用变量,两者都工作正常。

import subprocess
import os
# ...

x="05/May/2017"

print 'Date =',x

subprocess.call(['echo Hello World from method 1'], shell=True)
os.system('echo Hello World from method 2')

print "Month from method 1 ="
subprocess.call(['echo $x | cut -f2 -d/'])


print "Month from method 2 ="
m=os.system('echo $x | cut -f2 -d/')
print m

问题在哪里,我该如何克服这个问题?

2 个答案:

答案 0 :(得分:0)

问题是python变量没有传递给子进程(shell命令)。

简单的解决方案:

m=subprocess.getoutput('echo %s | cut -f2 -d/' % (x,))

'echo %s | cut -f2 -d/' % (x,)将首先使用变量x的内容替换'%s',然后调用 subprocess.getoutput('echo 05/May/2017 | cut -f2 -d/')

答案 1 :(得分:0)

如果要将环境变量传递给子流程,则必须将其显式添加到os.environ,如下所示。另一种选择是创建一个新环境并将其传递给.call

import subprocess;
import os;
os.environ['foo'] = "bar";
subprocess.call('echo $foo', shell=True);

在上述情况下,您还需要shell=True,否则subprocess.call会查找字面上称为echo $foo的可执行文件。

当然我们可以手动设置命令行参数:

foo = "bar";
subprocess.call(['echo', foo]);

但是它不是环境变量。

至于你正在进行的实际调用,我希望你只是为了实验而运行cut作为子进程,这样的字符串处理在Python脚本本身会更好。