2017-02-18 28 views
2

Я хочу запустить следующие строки команд Linux bash внутри программы python.Как запустить многострочные команды bash внутри python?

tail /var/log/omxlog | stdbuf -o0 grep player_new | while read i 
do 
    Values=$(omxd S | awk -F/ '{print $NF}') 
    x1="${Values}" 
    x7="${x1##*_}" 
    x8="${x7%.*}" 
    echo ${x8} 
done 

Я знаю, что для команды однолинейной, мы можем использовать следующий синтаксис:

subprocess.call(['my','command']) 

Но, как я могу использовать subprocess.call, если есть несколько команд в нескольких строках!?

+2

Я не знаю, что это правильное решение, но в Баше вы можете заменить несколько строк с полом -colons. Например, 'tail/var/log/omxlog | stdbuf -o0 grep plater_new | при чтении i; do Values ​​= $ (omxd S | awk -F/'{print $ NF}'); x1 = "$ {Значения}"; ... и т. д. Это, конечно, не очень читаемо, но оно должно работать. Есть ли причина, по которой у вас не может быть скрипт bash? – Guest

+0

Почему вы не можете поместить его в сценарий? – Inian

+1

В этом посте есть некоторые хорошие вещи об использовании subprocess.pipe http://stackoverflow.com/a/13332300/1113788 другой возможностью может быть просмотр библиотеки ткани python, которая имеет различные возможности для выполнения локального и удаленного кода – davidejones

ответ

1

Вот чистый питон решение, которое я думаю делает то же самое, как ваш bash:

logname = '/var/log/omxlog' 
with open(logname, 'rb') as f: 
    # not sure why you only want the last 10 lines, but here you go 
    lines = f.readlines()[-10:] 

for line in lines: 
    if 'player_new' in line: 
     omxd = os.popen('omxd S').read() 
     after_ = omxd[line.rfind('_')+1:] 
     before_dot = after_[:after_.rfind('.')] 
     print(before_dot) 
+0

Спасибо @StephenRauch за ваш ответ. Это был мой первоначальный вопрос о bash: http://unix.stackexchange.com/questions/345374/how-to-get-the-last-words-of-the-line-in-log, который может помочь в точном питоне решение. Спасибо миллиарду за ваше время и поддержку. – Omid1989

+1

@ Omid1989 - О, вы остановились на '-f' в вашем примере выше ... Теперь это имеет немного больше смысла. –

+0

yes Я удалил '-f', потому что я хочу отправить переменную' x8' через SPI, если получен некоторый код. (Raspberry Pi 3) – Omid1989

2

цитата https://mail.python.org/pipermail/tutor/2013-January/093474.html:
использование subprocess.check_output (shell_command, оболочки = True)

import subprocess 
cmd = ''' 
tail /var/log/omxlog | stdbuf -o0 grep player_new | while read i 
do 
    Values=$(omxd S | awk -F/ '{print $NF}') 
    x1="${Values}" 
    x7="${x1##*_}" 
    x8="${x7%.*}" 
    echo ${x8} 
done  
''' 
subprocess.check_output(cmd, shell=True) 

меня попробовать некоторые другие примеры, и это работает.