从python运行linux命令

Dar*_*ylF 7 python linux

我需要从python运行这个linux命令并将输出分配给变量.

ps -ef | grep rtptransmit | grep -v grep
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用pythons命令库来做到这一点.

import commands
a = commands.getoutput('ps -ef | grep rtptransmit | grep -v grep')
Run Code Online (Sandbox Code Playgroud)

但是结束了.我得到的输出是:

'nvr      20714 20711  0 10:39 ?        00:00:00 /opt/americandynamics/venvr/bin/rtptransmit setup_req db=media  camera=6  stream=video  substream=1  client_a'
Run Code Online (Sandbox Code Playgroud)

但预期的输出是:

nvr      20714 20711  0 10:39 ?        00:00:00 /opt/americandynamics/venvr/bin/rtptransmit setup_req db=media  camera=6  stream=video  substream=1  client_address=192.168.200.179  client_rtp_port=6970  override_lockout=1  clienttype=1
Run Code Online (Sandbox Code Playgroud)

有谁知道如何阻止输出被切断或任何人可以建议另一种方法?

lun*_*orn 7

ps显然限制其输出以适应终端的假定宽度.您可以使用$COLUMNS环境变量或使用--columns选项to 覆盖此宽度ps.

commands模块已弃用.使用subprocess得到的输出ps -ef,并在Python进行过滤.不要shell=True像其他答案所建议的那样使用,在这种情况下它简直是多余的:

ps = subprocess.Popen(['ps', '-ef', '--columns', '1000'], stdout=subprocess.PIPE)
output = ps.communicate()[0]
for line in output.splitlines():
    if 'rtptransmit' in line:
        print(line)
Run Code Online (Sandbox Code Playgroud)

您可能还想查看pgrep可以直接搜索特定进程的命令.


faj*_*ran 6

我通常用于subprocess运行外部命令。对于您的情况,您可以执行以下操作

from subprocess import Popen, PIPE

p = Popen('ps -ef | grep rtptransmit | grep -v grep', shell=True,
          stdout=PIPE, stderr=PIPE)
out, err = p.communicate()
Run Code Online (Sandbox Code Playgroud)

输出将是out可变的。


var*_*tec 5

commands已弃用,您不应该使用它。改用subprocess

import subprocess
a = subprocess.check_output('ps -ef | grep rtptransmit | grep -v grep', shell=True)
Run Code Online (Sandbox Code Playgroud)

  • 有很多方法可以获取 `ps` 的输出,从坏的到好的。但是,如果未设置“ps”列宽度,输出将被截断,这就是问题和答案的要点。因此,争论没有必要使用外壳和管道是愚蠢的,因为这不是重点。 (4认同)
  • @lunaryorn:问题是如何在 Python 中运行该命令,而不是如何在 Python 中 grep 该命令。 (2认同)