使用Popen获取Python命令的输出

时间:2014-02-18 16:58:07

标签: python bash shell

我正在尝试从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如何执行我失踪的命令?

2 个答案:

答案 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'