einbinden des subprocess Moduls

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
mikanoca
User
Beiträge: 26
Registriert: Dienstag 15. Juni 2010, 11:02

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
BlackJack

@mikanoca: ``echo`` ist kein Programm sondern ein internes Kommando der Shell.
mikanoca
User
Beiträge: 26
Registriert: Dienstag 15. Juni 2010, 11:02

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 ?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
mikanoca
User
Beiträge: 26
Registriert: Dienstag 15. Juni 2010, 11:02

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

EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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 ;-)
Das Leben ist wie ein Tennisball.
mikanoca
User
Beiträge: 26
Registriert: Dienstag 15. Juni 2010, 11:02

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...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
mikanoca
User
Beiträge: 26
Registriert: Dienstag 15. Juni 2010, 11:02

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 ?
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Kürzer, portabel, leichter verständlich, startet keine Shell (was man aus Sicherheitsgründen vermeiden sollte).
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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)".
Das Leben ist wie ein Tennisball.
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.
mikanoca
User
Beiträge: 26
Registriert: Dienstag 15. Juni 2010, 11:02

vielen Dank an alle,

ich werde versuchen das zu tun :)

Gruß, mikanoca
Antworten