使用 Python 中的参数执行 bash 命令

Execute a bash command with parameter in Python

这是一个 bash 命令,我 运行 在 python 中得到了预期的结果:

count = subprocess.Popen("ps -ef | grep app | wc -l", stdout=subprocess.PIPE, shell=True)

但是当我想传递一个参数(在本例中为计数)时,我不知道该怎么做。 我试过了:

pid = subprocess.call("ps -ef | grep app | awk -v n=' + str(count), 'NR==n | awk \'{print }\'", shell=True)

args = shlex.split('ps -ef | grep app | awk -v n=' + str(count), 'NR==n | awk \'{print }\'')
pid = subprocess.Popen(args, stdout=subprocess.PIPE, shell=True)

在其他尝试中,来自这里的各种帖子,但仍然无法成功。

您混淆了开盘价和收盘价,并且在其他尝试中错误地传递了一个冒号。

试试这个来解决问题:

pid = subprocess.call("ps -ef | grep app | awk -v n=" + str(count) + " NR==n | awk '{print }'", shell=True)

您使用 " 打开了命令参数,因此您需要在使用 " 而不是 ' 执行 + str() 之前关闭它。此外,我将 , 'NR=+ "NR= 交换,因为您想向命令附加更多内容而不是将参数传递给 subprocess.call().

正如评论中所指出的那样,将命令与 shlex 分开是没有意义的,因为 subprocess 中未实现管道命令,但我想指出使用 [=通常不推荐使用 20=],因为例如 examples given here.

之一

另一个 vay 正在使用格式:

pid = subprocess.call("ps -ef | grep app | awk -v n={} NR==n | awk '{{print }}'".format(str(count)), shell=True)

您的 Awk 管道可以大大简化 - 如果目标是打印最后一场比赛,ps -ef | awk '/app/ { p= } END { print p }' 可以做到这一点。但是很多时候,Python 中的 运行 Awk 只是愚蠢的,在 Python 中执行过滤既方便又容易,而且显然效率更高(您不仅节省了 Awk 过程,还有讨厌的 shell=True).

for p in subprocess.check_output(['ps', '-ef']).split('\n'):
    if 'app' in p:
        pid = p.split()[1]