使用 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]
这是一个 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]