Seite 1 von 1

einbinden des subprocess Moduls

Verfasst: Montag 11. Februar 2013, 17:26
von mikanoca
Hallo,
ich sitze hier in meinem Kämmerlein steh mal wieder auf dem Schlauch, weil irgendwo eine Variable nicht gesetzt ist oder irgend ein Modul nicht geladen wird oder was weiß ich... :roll:
Ich habe keine Idee:

Code: Alles auswählen

import subprocess
import sys

dir(subprocess)

print(sys.path)
print(sys.pythonpath)

p = subprocess.call(["echo", "Hello World!"])
Warum liefert mir die letzte Zeile einen Fehler ?
Traceback (most recent call last):
File "C:\Program Files\Python3.3\lib\subprocess.py", line 1090, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] Das System kann die angegebene Datei nicht finden
Ich starte python aus eine DOS SHell heraus (Windows Vista)

Vielen Dank

Re: einbinden des subprocess Moduls

Verfasst: Montag 11. Februar 2013, 17:32
von BlackJack
@mikanoca: ``echo`` ist kein Programm sondern ein internes Kommando der Shell.

Re: einbinden des subprocess Moduls

Verfasst: Montag 11. Februar 2013, 17:39
von mikanoca
aha :) Das hört sich logisch an.

Wie komme ich denn an die Kommandos der DOS Shell heran ? Wenn ich mich richtig erinnere ging das in 2.6 mit os.system und subprocess soll das doch ablösen
Oder habe ich das falsch in Erinnerung ?

Re: einbinden des subprocess Moduls

Verfasst: Montag 11. Februar 2013, 17:51
von cofi
Indem du `subprocess` das ueber die Shell ausfuehren laesst.

Nachdem das nun aus dem Weg ist, solltest du erzaehlen was du vorhast. Ich kann mir gerade keinen sinnvollen Einsatz dafuer vorstellen, den man nicht auch in Python selbst hinbekommen wuerde.

Re: einbinden des subprocess Moduls

Verfasst: Montag 11. Februar 2013, 18:02
von mikanoca
Indem du `subprocess` das ueber die Shell ausfuehren laesst.
Verstehe ich nicht ganz :

Code: Alles auswählen

subprocess.call('cmd.exe')
und dann ?

Letztendlich will ich nur prüfen, ob eine Datei existiert. In etwas so

Code: Alles auswählen

if subprocess.call(['dir', 'meineDatei.txt'])
    ...
else
    ... # erzeuge Datei


Re: einbinden des subprocess Moduls

Verfasst: Montag 11. Februar 2013, 18:09
von EyDu
mikanoca hat geschrieben:Verstehe ich nicht ganz :
Du könntest noch einmal einen genauen Blick auf die Dokumentation zu subprocess.call werfen ;-)
mikanoca hat geschrieben:Letztendlich will ich nur prüfen, ob eine Datei existiert.
Auch dafür bietet Python Module an ;-)

Re: einbinden des subprocess Moduls

Verfasst: Montag 11. Februar 2013, 18:18
von mikanoca
Ey Du Eydu,

danke sehr, mit "shell='True'" geht das
das liebe ich an diesem Forum, hier wird man immer gezwungen, selber zu lesen :lol:

Aber vielleicht gibtst Du mir noch einen Tipp, was für ein Modul ich da noch nutzen soll...

Re: einbinden des subprocess Moduls

Verfasst: Montag 11. Februar 2013, 18:28
von cofi
Sicher, dafuer gibt es `os.path`: http://docs.python.org/2/library/os.path.html

Und hier die passende Funktion: http://docs.python.org/2/library/os.pat ... ath.exists

Auch wenn du den Kommentar mit dem Lesen sicherlich ironisch meintest: Das ist tatsaechlich gut. Andere schmeissen einen mit Loesungen genau fuer das geschilderte Problem zu, nur zeigt auch deine Anfrage auch wieder: Du willst eigentlich etwas ganz anderes und wuerdest sehr wahrscheinlich die urspruenglichen Loesungen zurechtfrickeln ohne sie wirklich zu verstehen.

Re: einbinden des subprocess Moduls

Verfasst: Montag 11. Februar 2013, 19:10
von mikanoca
neenee, war schon ironisch gemeint. Jetzt komme ich in meinem Kämmerlein weiter.

Nichtsdestotrotz finde ich diese Lösung mit subprocess nicht so viel schlechter als die mit os.path.exists:

Code: Alles auswählen

import subprocess

if subprocess.call(['dir', 'meineDatei'], shell=True)
    ...
oder

Code: Alles auswählen

import os.path

if os.path.exists('meineDatei')
    ...
Gibt es einen einfachen Grund für die 2. Lösung ?

Re: einbinden des subprocess Moduls

Verfasst: Montag 11. Februar 2013, 19:35
von webspider
Kürzer, portabel, leichter verständlich, startet keine Shell (was man aus Sicherheitsgründen vermeiden sollte).

Re: einbinden des subprocess Moduls

Verfasst: Montag 11. Februar 2013, 19:43
von cofi
Die Sicherheitsgruende greifen erst dann, wenn man Eingaben von aussen verarbeitet. Die Doku hat hier auch einen wundnerschoen roten Abschnitt dazu: http://docs.python.org/2/library/subpro ... -arguments

Da aber eine Shell gestartet wird, wird auch ein Kindprozess gestartet - was unter Windows relativ teuer ist.

Re: einbinden des subprocess Moduls

Verfasst: Montag 11. Februar 2013, 19:54
von EyDu
Abhängig von deiner Problemstellung sind beide deiner Ansätze keine korrekten Lösungen. Prinzipiell ist es am sinnvollsten, wenn du erstmal versuchst die Operation durchzuführen, welche du machen möchtest. In deinem Fall wohl das Schreiben in eine Datei. Wenn das nicht Funktioniert, wird eine Exception geworfen und du kannst darauf reagieren. Das ist nicht nur übersichtlicher sondern vermeidet gleichzeitig noch Race Conditions. Für dich mal zum Suchen: "Look Before You Leap (LBYL)" und "Easier to Ask Forgiveness Than Permission (EAFP)".

Re: einbinden des subprocess Moduls

Verfasst: Montag 11. Februar 2013, 19:58
von lunar
@mikanoca Die zweite Lösung funktioniert zuverlässig. Die erste nicht. Einfach genug?

Unabhängig davon gilt das von EyDu gesagte. Prüfe nicht vorher, ob eine Operation auf einer Datei möglich ist, sondern versuche die Operation einfach, und fange auftretende Ausnahmen ab.

Re: einbinden des subprocess Moduls

Verfasst: Montag 11. Februar 2013, 20:21
von mikanoca
vielen Dank an alle,

ich werde versuchen das zu tun :)

Gruß, mikanoca