从python运行linux命令

从python运行linux命令,python,linux,Python,Linux,我需要从python运行这个linux命令,并将输出分配给一个变量 ps -ef | grep rtptransmit | grep -v grep 我已经尝试使用pythons命令库来实现这一点 import commands a = commands.getoutput('ps -ef | grep rtptransmit | grep -v grep') 但是,a被切断了。我得到的结果是: 'nvr 20714 20711 0 10:39 ? 00:00:00

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

ps -ef | grep rtptransmit | grep -v grep
我已经尝试使用pythons命令库来实现这一点

import commands
a = commands.getoutput('ps -ef | grep rtptransmit | grep -v grep')
但是,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_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

是否有人知道如何阻止输出被切断,或者有人可以建议其他方法?

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

from subprocess import Popen, PIPE

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

输出将是in
out
变量。

命令已弃用,您不应使用它。改用
子流程

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

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

命令
模块已弃用。使用
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
命令,通过该命令可以直接搜索特定进程

#!/usr/bin/python
import os

a = os.system("cat /var/log/syslog")

print a


from subprocess import call

b = call("ls -l", shell=True)

print b


import subprocess

cmd = subprocess.check_output('ps -ef | grep kernel', shell=True)

print cmd
上述任何脚本都适用于您:-)

nano test.py
导入操作系统
a=操作系统('ps-ef | grep rtptransmit | grep-v grep')
印刷品(a)
python test.py
python3 test.py


如果要在命令中使用管道,则需要使用
shell
。关于
grep
,我实际上只是复制并粘贴了问题中的命令。我怀疑第二个
grep
存在,因为有时我们执行的
grep
命令似乎也是grep-ed,因此需要删除。使用
grep[r]tptransmit
实际上可以避免这种情况,我知道在命令中使用管道需要
shell=True
,第二个
grep
是从过滤的进程列表中删除第一个
grep
命令。但在这种情况下,管道和
grep
都是多余的。@lunaryor更糟。Python代码在我的环境中生成一个截断的输出:如果
$COLUMNS
被隐式设置,那么
ps
会忽略它,例如,输出(在shell中)比
shutil.get\u terminal\u size()长
os.environ['COLUMNS']
引发KeyError,但
echo$COLUMNS
对应于
shutil.get\u terminal\u size()
@lunaryorn:问题是如何在Python中运行该命令,而不是如何在Python中grep该命令。实际上,问题是如何避免截断
ps
输出。但这与我的观点并不矛盾…@lunaryorn:而且,如果没有
shell=True
shell管道将无法工作,那么你在这一点上也错了。那又怎样?关键是,在这种情况下,您不需要shell管道……有许多方法可以将
ps
的输出从一个坏的转换为一个好的。但是,如果未设置
ps
列宽,则输出将被截断,这是问答的重点。因此,认为使用shell and pipes是没有必要的观点是愚蠢的,因为这不是重点。请您添加更多关于此解决方案如何解决此问题的信息。以下是一些指导原则。提供的答案可能是正确的,但可以从解释中获益。