subprocess call verhält sich anders als aufruf in der shell

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
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Hi,

ich habe ein bashscript über das ich mails mit anhang sende und welches ich mit ein paar Parametern aufrufen muss.
Setze ich den Befehl direkt in der Shell ab, funktioniert alles ohne probleme, rufe ich es aus einem Python-Script per subprocess.call auf, kommt der Anhang nicht mit, und ich bekomme eine komische fehlermeldung, eine mail wird aber gesendet.

Kann mir vielleicht jemand auf die Sprünge helfen?

Code: Alles auswählen

#! /usr/local/bin/python

import subprocess

mlsnd = ' '.join([
    '/home/***/bin/mail2.sh',
    '***@***.de',
    '***@***.de',
    '"Betreff"',
    '"see attachment for details"',
    '"***.csv"'
])

mlsnd = ' '.join(mlsnd)
print mlsnd
subprocess.call(mlsnd, shell=True)

Code: Alles auswählen

[***@*** ~/***]$ python mailtest.py
/home/***/bin/mail2.sh ***@***.de ***@***.de "Betreff" "see attachment for details" "***.csv"
[[: not found
[***@*** ~/***]$ /home/***/bin/mail2.sh ***@***.de ***@***.de "Betreff" "see attachment for details" "***.csv"
[***@*** ~/***]$
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Wie wäre es mit der Alternative das ganze direkt in Python zu machen?
Such hier mal nach simplemail.py. Das ist ein kleines Script zum recht einfachen versenden von Mails.

Ganz nebenbei: subprocess erwartet ein tuple als Anweisung. Eben genau das, was du mit dem " ".join() vorher kaputt machst.
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

ja, über simplemail.py funktionert es, super danke! :D

Trotzdem würde es mich natürlich interessieren, was das problem mit subprocess ist...
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Wie geschrieben: subprocess braucht ein tuple.

subprocess.call(["ls", "-la", "/"])
Subprocess quotet dadurch automatisch. Versuch ob es damit geht.
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Hatte ich natürlich schon erfolglos probiert. Die Doku zeigt aber dass es auch anders geht: http://docs.python.org/2.7/library/subp ... -os-system
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Und ohne shell=True?
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

als Tuple:

Code: Alles auswählen

OSError: [Errno 8] Exec format error
als String

Code: Alles auswählen

OSError: [Errno 2] No such file or directory
Ist jetzt aber auch doch egal, ich habe das script schon auf simplemail.py umgebaut und es läuft. 8)

Danke nochmals.
Antworten