Запуск команды Linux из Python - PullRequest
7 голосов
/ 16 марта 2012

Мне нужно запустить эту команду linux из python и назначить вывод переменной.

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

Кто-нибудь знает, как предотвратить отключение вывода, или кто-нибудь может предложить другой метод?

Ответы [ 4 ]

7 голосов
/ 16 марта 2012

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, с помощью которой вы можете напрямую искать конкретные процессы.

4 голосов
/ 16 марта 2012

commands устарело, его не следует использовать. Используйте subprocess вместо

import subprocess
a = subprocess.check_output('ps -ef | grep rtptransmit | grep -v grep', shell=True)
4 голосов
/ 16 марта 2012

Я обычно использую 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 голос
/ 09 июля 2018
#!/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

Любой из вышеперечисленных скриптов будет работать для вас: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...