从python运行linux命令
我需要从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
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()
输出将是inout
变量。命令已弃用,您不应使用它。改用子流程
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是没有必要的观点是愚蠢的,因为这不是重点。请您添加更多关于此解决方案如何解决此问题的信息。以下是一些指导原则。提供的答案可能是正确的,但可以从解释中获益。