Umstellung os.system zu subprocess

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
Zeusdragoon
User
Beiträge: 3
Registriert: Montag 12. Februar 2024, 10:59

Moin,
da ich gern eine Timeout integrieren möchte will ich auf subprocess wechseln.
Leider bekomme ich einen "SyntaxError: invalid syntax"

Funktion alleine läuft

Code: Alles auswählen

echo "E-Mail Text" | mail -s "E-Mail Betreff" xxx@Email.de
Funktion mit os.system im Python3 Skript läuft auf Raspberry PI Zero:

Code: Alles auswählen

Betreff="'Heizung Beekestr Modus wechsel'"
Text="'Steuerung neu gestartet'"
os.system("echo 'E-Mail Text' | mail -s 'E-Mail Betreff' xxx@Email.de")
Funktion mit subprocess geht nicht

Code: Alles auswählen

import subprocess
import sys
result=subprocess.run([sys.executable, "-c", "echo 'E-Mail Text' | mail -s 'E-Mail Betreff' xxx@Email.de"], capture_output=True, text=True, timeout=240)
print('output: ', result.stdout)
print('error: ', result.stderr)
Ich denke das es an der Wahl der Hochkomma liegt.
Bin aber Ratlos wie es zu optimieren ist.

Gruß Markus
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du denkst falsch. Das liegt an dem Versuch, das Kommando als python-Programm ausfuehern zu lassen. Warum willst du das? Das was du da machst ist equivalent zur Kommandozeile

Code: Alles auswählen

python -c "echo ... | ..."
Und Python kennt halt keine solche Syntax, darum auch der Fehler. Das sys.executable und -c muss also weg, aber dann geht's wegen der Pipe nicht.

Und das wuerde man auch so nie machen, weil es ganz anders geht: subprocess.run kennt das Argument "input", damit kannst du deinen Email-Text direkt eingeben.

Code: Alles auswählen

subprocess.run(["mail",  "-s", "betreff", "email"], input="Inhalt", ...)
Zeusdragoon
User
Beiträge: 3
Registriert: Montag 12. Februar 2024, 10:59

Vielen, vielen dank.
Es läuft.
Ich glaube ich muss mal heraufinden was das "echo" macht.
Hatte den Text von der Installation übernommen.

Gruß Markus
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das echo gibt den Inhalt der mail via stdin an das mail Kommando.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Zeusdragoon hat geschrieben: Montag 12. Februar 2024, 13:51 Ich glaube ich muss mal heraufinden was das "echo" macht.
Der Befehl echo gibt etwas auf der Standardausgabe im Terminal aus. Das Pipe Zeichen verbindet die Ausgabe eines Programms mit der Eingabe eines anderen Programms. Das gehört mit zur Unix-Philosophie.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
imonbln
User
Beiträge: 149
Registriert: Freitag 3. Dezember 2021, 17:07

Ich spreche einfach mal den Elefanten im Raum an, warum nimmst du ein externes Programm zum Senden einer E-Mail und nicht das Pythonmodule smtplib?
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@imonbln
Der Elefant muss erst noch die Frage nach dem echo-Befehl verdauen... ;)
Zeusdragoon
User
Beiträge: 3
Registriert: Montag 12. Februar 2024, 10:59

Wie die Sache mit dem Echo gezeigt hat bin ich nicht gerade Experte. Ich habe es mir damals auf jeden Fall angesehen. Denke das ich es nicht zum laufen bekommen habe.

Gruß Markus
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Experten fallen nicht vom Himmel. Dafür muss man viel Zeit investieren und dran bleiben.

Man sollte bezüglich externer Programme immer nachsehen, ob Python so etwas nicht schon in der Standardbibliothek hat. Falls nicht, gibt es noch pypi.org. Wenn z.B. smtplib zu nervig ist, da man sich gewissermaßen die E-Mail zusammenbauen muss, kann man z.B. das Modul emails verwenden.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten