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

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

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.