2012-03-16 230 views
7

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

ps -ef | grep rtptransmit | grep -v grep 

我试过使用pythons命令库来做到这一点。

import commands 
a = commands.getoutput('ps -ef | grep rtptransmit | grep -v grep') 

但一个得到切断的结束。我得到的输出是:

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

但预期输出是:

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 

有谁知道如何从被截断停止输出或任何人可以提出另一种方法?

回答

8

ps显然限制了它的输出以装配到终端的假定宽度。您可以使用$COLUMNS环境变量或使用--columns选项覆盖此宽度至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) 

你也可以给你看的pgrep命令,通过它可以直接搜索特定的进程。

3

我通常使用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() 

输出将在out变量。

+1

-1无用的'grep'和'shell = True'。 – lunaryorn 2012-03-16 10:58:56

+0

如果您想在命令中使用管道,则需要'shell'。关于'grep',我实际上只是复制并粘贴了问题中的命令。我怀疑那是第二个'grep',因为有时我们执行的'grep'命令也显示为grep-ed,因此需要删除。这实际上可以避免使用'grep [r] tptransmit' – fajran 2012-03-16 11:02:46

+0

我知道'shell = True'需要在命令中使用管道,并且第二个'grep'将从第一个'grep'命令中删除过滤的过程列表。但是在这种情况下,管道和'grep'都是多余的。 – lunaryorn 2012-03-16 11:07:13

4

commands已弃用,不应使用它。使用subprocess代替

import subprocess 
a = subprocess.check_output('ps -ef | grep rtptransmit | grep -v grep', shell=True) 
+2

-1代表无用的'grep'和'shell = True'。 – lunaryorn 2012-03-16 10:58:48

+0

@lunaryorn:问题是如何在Python中运行该命令,而不是如何在Python中运行该命令。 – vartec 2012-03-16 11:09:46

+0

其实问题是如何避免截断'ps'输出。但是这并不矛盾我的观点... – lunaryorn 2012-03-16 11:12:18