2016-05-01 3 views
0

I Ausgabe dieses Shell-Befehl wollen Teilprozess mit Python zu bekommen:Wie diese CLI-Befehl

loginctl show-session -p Display -p Active c2 

Ausgang ist:

Display=:0 
Active=yes 

In Python, ich es auf diese Weise tun:

import subprocess 
subprocess.call(['loginctl', 'show-session -p Display -p Active c2']) 

Ich erhalte diesen Fehler:

Unknown operation show-session -p Display -p Active c2 

Was könnte Ursache sein?

Antwort

3
subprocess.call(['loginctl', 'show-session', '-p', 'Display', '-p', 'Active', 'c2']) 

Oder, wenn Sie mit grundlegenden Shell-Splitting bequem sind:

import shlex 
cmd = 'loginctl show-session -p Display -p Active c2' 
subprocess.call(shlex.split(cmd)) 

vorsichtig sein, wenn das Senden Benutzereingabe dire ctlly zu str.split oder shlex.split und das Ergebnis mit subprocess verwendend, ist es zu einfach zu umgehen.

Hinzufügen shell = True sollte auch funktionieren, aber mit ein paar Nebenwirkungen, siehe official docs und this StackOverflow answer.

+0

'subprocess.call (cmd.split())' würde dies auch für einen Befehl wie 'git commit -m funktionieren Dies ist eine Nachricht "'? Beachten Sie die Verwendung von Leerzeichen. – aceph

+1

@aceph: Verwenden Sie '.split()' oder 'shlex.split()' nur, wenn die Eingabe hier ein Zeichenfolgenliteral ist - beide lassen sich leicht täuschen. '.split()' könnte verwendet werden, um die Zeile weniger "laut" zu machen, um den Befehl lesbarer zu machen. Wenn die Eingabe keine Konstante ist, dann benutze eine Liste: * ein Listenelement pro Kommandozeilenargument * – jfs

+0

@aceph - nein, in deinem Fall wird es nicht, aber wie @J.F sagte Sebastian 'shlex.split' wird. Traue niemals mit externen Eingaben. Bearbeitet die Antwort, shlex.split ist viel besser als str.split hier (TIL) – orip

-1

Versuchen mit shell = True:

import subprocess 
subprocess.call('loginctl show-session -p Display -p Active c2', shell= True) 

Ausgang:

Display=:0 
Active=yes 
+0

Upvoted, da dies für schnelle & schmutzige Fälle gilt (zB Ersetzen eines Shell-Skripts), aber Sie sollten sich der Implementierung und der Risiken bewusst sein: official docs - https://docs.python.org/2/library/subprocess.html # häufig verwendete Argumente, SO Antwort - http://stackoverflow.com/a/3172488/37020 – orip