2017-02-18 2 views
2

Ich möchte die folgenden Zeilen von Linux bash Befehle in einem Python-Programm ausführen.Wie werden mehrzeilige Bash-Befehle in Python ausgeführt?

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 

Ich weiß, dass für einen einzeiligen Befehl, können wir die folgende Syntax verwenden:

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

Aber, wie kann ich subprocess.call verwenden, wenn es mehrere Befehle in mehrere Zeilen sind!?

+2

Ich weiß nicht, dass dies eine richtige Lösung ist, aber in der Bash können Sie mehrere Zeilen mit halb ersetzen -Kolonnen. Zum Beispiel 'tail/var/log/omxlog | stdbuf -o0 grep plater_new | während ich lese; do Werte = $ (omxd S | awk -F/'{print $ NF}'); x1 = "$ {Werte}"; ... 'und so weiter. Es ist sicherlich nicht gut lesbar, aber es sollte funktionieren. Gibt es einen Grund, warum Sie kein Bash-Skript ausführen können? – Guest

+0

Warum können Sie es nicht stattdessen in ein Skript einfügen? – Inian

+1

es gibt einige gute Sachen in diesem Beitrag über die Verwendung von subprocess.pipe http://StackOverflow.com/A/13332300/1113788 eine andere Option könnte sein, um die Python-Fabric-Bibliothek, die verschiedene Optionen zum Ausführen von lokalen und Remote-Code – davidejones

Antwort

1

Hier ist eine reine Python-Lösung, die ich tut das gleiche denken als 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

Vielen Dank @StephenRauch für Ihre Antwort. Dies war meine erste Frage auf Bash: http://unix.stackexchange.com/questions/345374/how-to-get-the-last-words-of-the-line-in-log es könnte helfen, eine genaue Python Lösung. Tausend Dank für deine Zeit und Unterstützung. – Omid1989

+1

@ Omid1989 - OH, du hast in deinem obigen Beispiel das '-f' weggelassen ... Jetzt macht es ein bisschen mehr Sinn. –

+0

ja Ich habe '-f' entfernt, weil ich die' x8' Variable via SPI senden möchte, wenn ein bestimmter Code empfangen wird. (Raspberry Pi 3) – Omid1989

2

Zitat https://mail.python.org/pipermail/tutor/2013-January/093474.html:
Verwendung subprocess.check_output (shell_command, Shell = 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) 

Ich versuche, haben einige andere Beispiele und es funktioniert.

Verwandte Themen