4 Stimmen

Python-Subprozess: Warum funktioniert die Liste der Argumente nicht analog zum vollständigen Shell-String?

Vielen Dank im Voraus für jede Hilfe. Ich bin neu in Python, aber nicht besonders neu in Skripting. Ich versuche, ein einfaches, automatisiertes E-Mail-Programm auszuführen, aber das E-Mail-Modul scheint auf unserem System falsch installiert zu sein (ich habe 75% der in den Python-Beispielen beschriebenen Funktionen nicht, nur "message_from_string" und "message_from_file") und smtplib ist zu kompliziert für das, was ich brauche.

In einfachen Bash-Begriffen ausgedrückt, ist alles, was ich brauche:

/bin/email -s "blah" "recipients" < file.with.body.info.txt

oder,

echo "my body details" | /bin/email -s "blah" "recipients"

damit ich nicht in eine Datei schreiben muss, nur um eine Nachricht zu senden.

Ich habe versucht, mit subprocess, entweder Aufruf oder Popen, und der einzige Weg, den ich schließlich bekommen konnte Dinge zu arbeiten ist, wenn ich verwendet:

subprocess.call('/bin/mail -s "blah" "recipients" < file.with.body.info.txt', shell=True)

Es gibt ein paar Dinge, die ich an dieser Methode nicht mag:

(1) Ich konnte die Dinge nicht in eine Liste oder ein Tupel aufteilen, wie es eigentlich funktionieren sollte, so dass ich den ganzen Vorteil des Subprozesses, wie ich ihn verstehe, verloren habe, um die Dinge sicher zu halten. Wenn ich es versuchen würde:

subprocess.call(['/bin/mail', '-s', subjVariable, recipVariable, '<', 'file.with.body.info.txt'], shell=True)

würde es scheitern. Ebenso schlug es fehl, wenn ich versuchte, die Pipe "|" zu verwenden, anstatt aus einer Datei zu lesen. Es schlug auch fehl, wenn ich '-cmd' anstelle einer Pipe verwendete. Der Fehler bestand in der Regel darin, dass '<' und 'file.with.body.info.txt' gelesen wurden, als ob sie weitere Empfänger wären. Mit anderen Worten: Ob ich nun "shell = True" sagte oder nicht, subprocess war nicht in der Lage, die Sonderzeichen im Aufruf als die Sonderzeichen zu interpretieren, die sie sind. <' wurde nicht als Eingabe aus einer Datei erkannt, usw., es sei denn, ich habe alles in einem großen Aufruf zusammengefasst.

Was ich idealerweise gerne machen würde, weil es mir sicherer und flexibler erscheint, ist so etwas wie das hier:

subprocess.call(['/bin/echo', varWithBody, '|', '/bin/mail', '-s', subjVariable, recipVariable,])

aber es scheint, dass Pipes überhaupt nicht mit subprocess verstanden werden, und ich kann nicht herausfinden, wie man Dinge zusammen Pipe während hinter Python stecken.

Irgendwelche Vorschläge? Jede Hilfe ist willkommen, mit Ausnahme von Erklärungsversuchen zur Verwendung der Module "email" oder "smtplib". Unabhängig von dieser speziellen Anwendung möchte ich wirklich lernen, wie ich Unterprozesse besser nutzen kann, damit ich verschiedene Programme miteinander verbinden kann. Meines Erachtens sollte Python darin ziemlich gut sein.

Danke! Mike

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X