Seite 1 von 1

Script Extern ausführen??

Verfasst: Montag 6. April 2009, 12:06
von fecub
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

Verfasst: Montag 6. April 2009, 14:06
von DasIch
Verwende nie os.system, os.popen oder was auch immer. Nimm besser dass subprocess Modul.

Verfasst: Montag 6. April 2009, 18:37
von gerold
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. ;-)

.

Verfasst: Mittwoch 8. April 2009, 11:54
von lunar
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.

Verfasst: Mittwoch 8. April 2009, 12:33
von gerold
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
:-)

Verfasst: Mittwoch 8. April 2009, 12:40
von CM
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

Verfasst: Mittwoch 8. April 2009, 12:52
von lunar
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.