Ich versuche mit gerade mit subprocess.check_output.
Ich möchte/muss die Ausgabe des Kommandos (eine Seitenzahl) auswerten.
Das bash-Kommando sieht ungefähr so aus:
pdfgrep -in blablablub /tmp/tmpihqUGr/test3.pdf | sed s/:.*//| sed q
Beschränke ich das Kommando auf den pdfgrep-Teil dann kommt etwa sowas raus:
3:blablablub
Muss ich für check_output tatsächlich jede Gruppe als einzelnen Parameter eingeben ?
Parameterübergabe an check_output
@drnicolas: das Pipe-Zeichen `|` wird von der Shell interpretiert, wenn man aber Python hat, dann würde man die simplen sed-Befehle eher gleich direkt mit Python schreiben.
Code: Alles auswählen
content = subprocess.check_output(["pdfgrep", "-in", "blablablub", "/tmp/tmpihqUGr/test3.pdf"])
content = content.split(":", 1)[0]
@drnicolas: Es gibt einen Parameter shell, der wenn auf True gesetzt, ein Shell-ähnliches Verhalten erzeugt. Damit kann
man das Kommando mit allen Parametern (und ich hoffe auch die Pipe Zeichen) als ein String übergeben.
Z.B. funktioniert
nicht. Aber
hat bei mir funktioniert. Auch ein Aufruf von subprocess.check_output('ls -l', shell=True) lieferte Ausgabe.
Ohne shell=True muss wohl jeder Parameter einzeln übergeben werden und Pipe geht nicht (da Shell spezifisch).
Grüße, Eckhard
man das Kommando mit allen Parametern (und ich hoffe auch die Pipe Zeichen) als ein String übergeben.
Z.B. funktioniert
Code: Alles auswählen
import subprocess
subprocess.call('ls -l')
Code: Alles auswählen
import subprocess
subprocess.call('ls -l', shell=True)
Ohne shell=True muss wohl jeder Parameter einzeln übergeben werden und Pipe geht nicht (da Shell spezifisch).
Grüße, Eckhard
@eckhard: bei der Empfehlung von "shell=True" sollte auch der folgende Link mitgegeben werden:
https://docs.python.org/3/library/subpr ... iderations
Befehle wie "'ls -l'" lassen sich auch mit Funktionen der Standard Library sehr gut behandeln. Und für Pipes lohnt sich ein Blick auf Coroutinen.
https://docs.python.org/3/library/subpr ... iderations
Befehle wie "'ls -l'" lassen sich auch mit Funktionen der Standard Library sehr gut behandeln. Und für Pipes lohnt sich ein Blick auf Coroutinen.
@eckhard: Und genau diesen Parameter sollte man nicht verwenden, weil man sich damit die ganzen Probleme einhandelt wegen denen man `os.system()` nicht verwenden sollte und stattdessen `subprocess`. Wenn man Shell-Skripte schreiben möchte, dann sollte man Shell-Skripte schreiben und nicht Python Shells aufrufen lassen.
Und natürlich funktioniert ``subprocess.call('ls -l')`` nicht, da ist aber *nicht* die Lösung das ``shell``-Argument, sondern `call()` mit dem richtigen Argument aufzurufen: ``subprocess.call(['ls', '-l'])``. Da tatsächlich eine zusätzliche Shell zwischen zu schalten ist wirklich nur in Ausnahmefällen wirklich nötig.
Und natürlich funktioniert ``subprocess.call('ls -l')`` nicht, da ist aber *nicht* die Lösung das ``shell``-Argument, sondern `call()` mit dem richtigen Argument aufzurufen: ``subprocess.call(['ls', '-l'])``. Da tatsächlich eine zusätzliche Shell zwischen zu schalten ist wirklich nur in Ausnahmefällen wirklich nötig.