Parameterübergabe an check_output

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
drnicolas
User
Beiträge: 84
Registriert: Sonntag 24. Juli 2016, 10:32

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 ?
drnicolas
User
Beiträge: 84
Registriert: Sonntag 24. Juli 2016, 10:32

Habe schonmal versucht jeden einzelnen Parameter einzeln zu übergeben; das funktioniert leider nicht.
Alles hinter .pdf wird jeweils als File not found moniert.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@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]
eckhard
User
Beiträge: 33
Registriert: Montag 14. Dezember 2015, 10:06
Wohnort: Karlsruhe

@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

Code: Alles auswählen

import subprocess
subprocess.call('ls -l')
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
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@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.
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.
drnicolas
User
Beiträge: 84
Registriert: Sonntag 24. Juli 2016, 10:32

Vielen Dank für die Beiträge!
Die Methode mit .split hat funktioniert. Problem somit (zunächst) gelöst.
Antworten