python调用一个包含“echo”和“|”的命令行

时间:2013-02-26 22:13:41

标签: python command

我尝试使用python调用命令行执行一些文件。但是,当有一个包含“echo”和“|”(垂直条)的命令行时,subprocess.call似乎不能很好地工作。喜欢: 我跑的时候:

echo "perp -t ../data/ReviewTest.text" | ./eva -b ../data/6.binlm

我会得到我想要的东西。 但是,当我尝试这个run.py

import subprocess
e=["echo","\"perp", "-t", "../data/R.text\"", "|", "./eva", "-b", "../data/6.binlm"]
subprocess(e)

我会在命令行中显示除echo之外的所有内容,如:

".prep -t ..data/ReviewTest.text" | ./eva -b ../data/6.binlm

似乎在subprocess.call()中,当存在“echo”时,它之后的所有内容都将被抛出到命令行。

我希望当命令包含“echo”和“|”

时,我可以使用子进程。

感谢。

这是我在SO中提出的第三个问题,前两个问题都被视为重复。然而,在我问之前我真的很努力,但由于我不是母语,我不知道如何改变很多表达,我不能总是找到我想要的东西。所以如果这是另一个重复,我会向前道歉....

2 个答案:

答案 0 :(得分:2)

我认为这可能会达到你想要的效果(它应该完全重现你问题中列出的第一个命令行):

>>> import subprocess
>>> e = 'echo "perp -t ../data/ReviewTest.text | ./eva -b ../data/6.binlm'
>>> subprocess.call(e, shell=True)
  1. “|”是一个shell元字符,因此您需要使用subprocess.call调用shell=True

  2. 在命令行中,您将字符串"perp -t ../data/ReviewTest.text"作为echo的第一个也是唯一的参数传递,因此您需要传递相同的字符串,而不仅仅是{ {1}}参数字符串。

答案 1 :(得分:1)

管道|是一个shell构造,意味着该命令需要作为shell的输入运行。这意味着在调用shell=True时设置subprocess.call()

import subprocess
subprocess.call("""echo "perp -t ../data/ReviewTest.text" | ./eva -b ../data/6.binlm""", shell=True)

有关于在Python文档中使用shell=True的说明。