Script Extern ausführen??

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
fecub
User
Beiträge: 24
Registriert: Freitag 14. November 2008, 16:53
Kontaktdaten:

Montag 6. April 2009, 12:06

Grüßt euch leute,
ich habe ein Problem, ich möchte ein Shell-Skript extern aus meinem Programm ausführen, ich kann es mit os.system (""), aber das Script läuft nicht korrekt. Wenn ich es über die shell starte habe ich kein problem, aber wie gesagt wenn ich es mit dem programm starte läuft der script nicht richtig!?!?!? Hättet ihr vieleicht eine Idee wie ich dies lösen könnte??
Würde mich auf eure hilfe freuen!

greetz

fecub
DasIch
User
Beiträge: 2462
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Montag 6. April 2009, 14:06

Verwende nie os.system, os.popen oder was auch immer. Nimm besser dass subprocess Modul.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 6. April 2009, 18:37

DasIch hat geschrieben:Verwende nie os.system, os.popen oder was auch immer. Nimm besser dass subprocess Modul.
Hallo DasIch!

Ich verwende, so gut wie möglich "subprocess". Aber "subprocess" ist kompliziert und manche Programmaufrufe konnte ich auch nach Stunden des Probierens nicht mit "subprocess" durchführen. "os.system" ist für kleine administrative Arbeiten (also das Aufrufen von ein paar Kommandozeilenprogrammen -- ohne Rückgabe) bei weitem besser geeignet (weil einfacher) als "subprocess". Aber bei "os.popen" möchte ich nicht widersprechen. Das sollte man langsam ausmustern.

@fecub: Ohne einen Hinweis auf den Fehler, oder auf das was nicht funktioniert, werden wir dir wohl nicht helfen können.

mfg
Gerold
:-)

PS: "Stunden" ist vielleicht etwas übertrieben. ;-)

.
Zuletzt geändert von gerold am Mittwoch 8. April 2009, 12:39, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
lunar

Mittwoch 8. April 2009, 11:54

Dieses Argument kann ich nicht nachvollziehen. Was ist denn an "subprocess.call(['spam', 'with', 'some', 'arguments'])" komplizierter als an "os.system('spam with some arguments')"? Gerade bei administrativen Aufgaben ist subprocess.call() imho sogar einfacher, da man Kommandos als Liste zusammenbauen kann und sich nicht um Sonderzeichen in Dateinamen kümmern muss.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 8. April 2009, 12:33

lunar hat geschrieben:Dieses Argument kann ich nicht nachvollziehen. Was ist denn an "subprocess.call(['spam', 'with', 'some', 'arguments'])" komplizierter als an "os.system('spam with some arguments')"?
Hallo lunar!

Ein ähnliches Skript habe ich zuerst mit subprocess probiert zusammenzubauen. Bis ich irgendwann entnervt aufgegeben habe und os.system nahm. Das Original-Skript kann ich nicht zeigen, da ich es auf dem Computer eines Kollegen geschrieben habe. Aber ich glaube, es war der Aufruf des Programmes ntbackup der mir erst mit os.system gelungen ist.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
"""
Sichert die H-Festplatte auf die externe Festplatte

Copyright
    2009 by Gerold - http://halvar.at/
Created
    2009-03-01 by Gerold - http://halvar.at/
Requirements
    - Python: http://www.python.org/
"""

import os
import time
from string import Template


def main():
    ntbackup = r"J:\WINDOWS\system32\ntbackup.exe"
    bks_path = r"J:\Sicherungen\Sicherungsbatch_extern\hd_h_.bks"
    dest_path = r"F:\Backup\backup_hd_h_full_%s.bkf" % \
        time.strftime("%Y-%m-%d_%H%M%S")
    cmd = Template(
        '${ntbackup} backup "@${bks_path}" /F "${dest_path}" /L:s /M normal'
    ).substitute(locals())
    print cmd
    os.system(cmd)


if __name__ == "__main__":
    main()
EDIT:
Was ich nicht probiert habe, ist subprocess nur mit dem CMD-String zu füttern. subprocess wird bei mir immer (aus Gewohnheit) mit einer Argumentliste gefüttert.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Mittwoch 8. April 2009, 12:40

Hoi,

Mein Beispiel, wo ich auch mit subprocess nicht weitergekommen bin, wäre ein älteres Fortran-Programm (closed source) mit miserablem Command Line UI. Da war für mich os.system auch die einfachere Alternative (ich habe immer wieder andere Fehler durch die seltsamen Ausgaben erhalten, bis ich entnervt aufgegeben und mir einen Miniparser für das Logfile geschrieben habe). Also kann ich Gerold beipflichten: In fast 100% der Fälle ist subprocess die beste Wahl - aber eben nur fast 100%.

Gruß,
Christian
lunar

Mittwoch 8. April 2009, 12:52

Ok, Windows ist was anderes ... ;) subprocess muss aus der Liste eine Zeichenkette erstellen, da die verwendete Funktion "CreateProcess()" nichts anderes versteht. Bei dieser Manipulation kann natürlich was kaputt gehen, wenn man "exotische" Kommandozeilen hat ... allerdings kann man subprocess unter Windows auch einfach eine Zeichenkette übergeben.

Ich persönlich bin nur mit Linux und anderen Unix-Derivaten konfrontiert. Dort funktioniert eine Liste immer, völlig unabhängig von der Kommandozeilensyntax des aufgerufenen Programms.
Antworten