Seite 1 von 1
Parameterübergabe an check_output
Verfasst: Sonntag 31. Juli 2016, 14:50
von drnicolas
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 ?
Re: Parameterübergabe an check_output
Verfasst: Sonntag 31. Juli 2016, 14:54
von drnicolas
Habe schonmal versucht jeden einzelnen Parameter einzeln zu übergeben; das funktioniert leider nicht.
Alles hinter .pdf wird jeweils als File not found moniert.
Re: Parameterübergabe an check_output
Verfasst: Sonntag 31. Juli 2016, 15:13
von Sirius3
@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]
Re: Parameterübergabe an check_output
Verfasst: Sonntag 31. Juli 2016, 18:39
von eckhard
@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
Code: Alles auswählen
import subprocess
subprocess.call('ls -l', shell=True)
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
Re: Parameterübergabe an check_output
Verfasst: Sonntag 31. Juli 2016, 20:18
von kbr
@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.
Re: Parameterübergabe an check_output
Verfasst: Sonntag 31. Juli 2016, 20:24
von BlackJack
@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.
Re: Parameterübergabe an check_output
Verfasst: Sonntag 31. Juli 2016, 21:27
von drnicolas
Vielen Dank für die Beiträge!
Die Methode mit .split hat funktioniert. Problem somit (zunächst) gelöst.