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
Script Extern ausführen??
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo DasIch!DasIch hat geschrieben:Verwende nie os.system, os.popen oder was auch immer. Nimm besser dass subprocess Modul.
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo lunar!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')"?
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()
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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
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
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.

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.