我正在尝试从Python(2.6.4)中执行shell命令,以在将其作为参数传递给另一个程序之前评估一个简单的公式。我的输入很简单:
$ [2×2]
我想评估该表达式并从我的Python脚本中获取结果,以便稍后使用它。目前,我正在这样做(其中token
是$[2*2]
):
token = subprocess.Popen(["echo", token], stdout=subprocess.PIPE).communicate()[0].strip()
我希望输出为4
,但它只是给我回原始的令牌($[2*2]
)。显然,当我跳转到shell并手动运行此命令(echo $[2*2]
)时,我按预期得到4
。
有没有什么特别的关于Python如何执行我失踪的命令?
答案 0 :(得分:2)
当您在shell中运行echo $[2*2]
时, shell 会评估$[2*2]
并将该评估的结果传递给echo
命令。在你的Python代码中,你将$[2*2]
直接传递给echo,因此,它正在返回。
您可以使用shell=True
中的subprocess.Popen
来调用shell来评估您的命令:
token = subprocess.Popen(["echo " + token],
stdout=subprocess.PIPE, shell=True).communicate()[0].strip()
答案 1 :(得分:2)
subprocess.Popen
将自动转义传入的任何参数,以便使用这些文字字符串运行命令,或者换句话说,运行的命令等同于echo '$[2*2]'
。有两种方法可以解决这个问题:
使用shell=True
:
>>> import subprocess
>>> token = '$[2*2]'
>>> subprocess.Popen("echo " + token, stdout=subprocess.PIPE, shell=True).communicate()[0].strip()
'4'
运行bash或其他shell作为命令:
>>> subprocess.Popen(["bash", "-c", "echo " + token], stdout=subprocess.PIPE).communicate()[0].strip()
'4'