.bat mit Listeninhalt ausführen
- OttoPython
- User
- Beiträge: 47
- Registriert: Montag 23. April 2012, 14:14
Moin liebe Skrippter,
ich würde mit Python gerne mit nem Inhalt einer Liste 2 *.bat dateien nacheinander uasführen. Die Liste erstellen habe ich bereits ohne Probleme hinbekommen.
Aber nun Soll jede einzelne Skriptt zeile an 2 .bat dateien gegeben werden, die Wiederum etwas anderes ausführen.
Wie funktioniert das? hab diesbezüglich mir den subprocess angeguckt aber werde damit nicht ganz schlau.
beste Grüße Otto
ich würde mit Python gerne mit nem Inhalt einer Liste 2 *.bat dateien nacheinander uasführen. Die Liste erstellen habe ich bereits ohne Probleme hinbekommen.
Aber nun Soll jede einzelne Skriptt zeile an 2 .bat dateien gegeben werden, die Wiederum etwas anderes ausführen.
Wie funktioniert das? hab diesbezüglich mir den subprocess angeguckt aber werde damit nicht ganz schlau.
beste Grüße Otto
"Im Burnout steckt viel Arbeit drin" -Lysander
@OttoPython: Jede „einzelne Skriptt zeile” soll an zwei Batch-Dateien gegeben werden, bedeutet was genau? Welche Zeilen von welchem Skript? Oder meinst Du die Elemente in der Liste? Wie wird den Batchdateien etwas übergeben? Als Argumente beim Aufruf? Oder über die Standardeingabe?
- OttoPython
- User
- Beiträge: 47
- Registriert: Montag 23. April 2012, 14:14
Moin,
also nein sorry falsch ausgedrückt.
In der Liste werden dateien bestimmte dateienaufgelistet.(zusätzlich lass ich eine list.dat erstellen)
Python soll nun jede einzelne Zeile an zwei Bathdateien übergeben. Diese Batchfiles können den Dateinamen dann verwenden so wie er ist.
Es müssen aber immer beide Dateien gestartet worden seien bevor die erste .bat die nächste Zeile übergeben darf.
das soll bis zum ende der Liste passieren.
funktioniert sauber. aber ich habe keine vorstellung wie ich jedes einzelne element übergeben kann in eine bat
also nein sorry falsch ausgedrückt.
In der Liste werden dateien bestimmte dateienaufgelistet.(zusätzlich lass ich eine list.dat erstellen)
Python soll nun jede einzelne Zeile an zwei Bathdateien übergeben. Diese Batchfiles können den Dateinamen dann verwenden so wie er ist.
Es müssen aber immer beide Dateien gestartet worden seien bevor die erste .bat die nächste Zeile übergeben darf.
das soll bis zum ende der Liste passieren.
Code: Alles auswählen
liste = []
for root, dirs, files in os.walk(polpath):
for elements in files:
liste.append(elements)
if liste:
fobj = open('list.dat','w')
for elements in liste:
print >> fobj, elements
fobj.close()
"Im Burnout steckt viel Arbeit drin" -Lysander
Ich kann mir nicht ernsthaft vorstellen, dass Batchdateien (Du meinst schon Windows, nicht Linux-Shellskripte?) etwas können, was in Python nicht ebenso gut oder besser zu machen wäre. Mit anderen Worten, ich würde erst mal untersuchen, ob Du die Batchdateien wirklich als solche brauchst.OttoPython hat geschrieben:Moin,
also nein sorry falsch ausgedrückt.
In der Liste werden dateien bestimmte dateienaufgelistet.(zusätzlich lass ich eine list.dat erstellen)
Python soll nun jede einzelne Zeile an zwei Bathdateien übergeben. Diese Batchfiles können den Dateinamen dann verwenden so wie er ist.
Es müssen aber immer beide Dateien gestartet worden seien bevor die erste .bat die nächste Zeile übergeben darf.
das soll bis zum ende der Liste passieren.
...
Möglich ist natürlich, dass Du dann immer noch nicht um subprocess herumkommst, wenn nämlich Deine Batchdateien andere Programme starten. Trotzdem hätte sich der Gesamtaufbau vereinfacht.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Na, so sauber ist das auch nicht...OttoPython hat geschrieben:funktioniert sauber. aber ich habe keine vorstellung wie ich jedes einzelne element übergeben kann in eine batCode: Alles auswählen
liste = [] for root, dirs, files in os.walk(polpath): for elements in files: liste.append(elements) if liste: fobj = open('list.dat','w') for elements in liste: print >> fobj, elements fobj.close()
- `liste` ist ein schlechter Name. Wieso nicht `filenames`
- Ein file-Objekt besitzt eine `write`-Methode
- Dateien sollte man mit `with` öffnen
Ich käme zu diesem Code:
Code: Alles auswählen
filenames = []
for root, dirs, files in os.walk(polpath):
filenames.extend(files)
if filenames:
with open("liste.dat", "w") as outfile:
outfile.write("\n".join(filenames))
Was genau machen denn diese Batch-Scripte? Wenn es nicht allzu kompliziert ist, könnte man das ggf. in Python umsetzen oder zumindest die darin enthaltenen Programmaufrufe direkt mittels `subprocess` realisieren.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- OttoPython
- User
- Beiträge: 47
- Registriert: Montag 23. April 2012, 14:14
danke erstmal für den "with" Beitrag.. stimmt natürlich.
Also ich bin mit meinen Bezeichnungen ziemlich durcheinander beim schreiben und denken gekommen.
Die Python Liste soll jede einzelne Zeile als Parameter an zwei *.exe NICHT *.bat (meinFehler sorry) und diese beiden Exen können mit der zeile selbst weiterarbeiten.
ich habe mir den subprocess gestern schon mal durchgelesen in der Doku aber ich werde nicht ganz schlau was ich davon brauche und was nicht. Es muss lediglich jede Zeile einzeln an beide .exe dateien übergeben werden bis zum ende der liste. wahrscheinlich schon sinnvoll das in der Schleife zumachen wenn die list.dat geschrieben wird oder?
wie komme ihc auf .bat : ich habe dafür von einer Kolleegin ein .Bat datei die die aufgabe meiner Python datei bislang getan hat.. aber bei dieser .bat treten hin und wieder fehler auf da es sich um ziemlich große datenmengen handelt.
Also ich bin mit meinen Bezeichnungen ziemlich durcheinander beim schreiben und denken gekommen.
Die Python Liste soll jede einzelne Zeile als Parameter an zwei *.exe NICHT *.bat (meinFehler sorry) und diese beiden Exen können mit der zeile selbst weiterarbeiten.
ich habe mir den subprocess gestern schon mal durchgelesen in der Doku aber ich werde nicht ganz schlau was ich davon brauche und was nicht. Es muss lediglich jede Zeile einzeln an beide .exe dateien übergeben werden bis zum ende der liste. wahrscheinlich schon sinnvoll das in der Schleife zumachen wenn die list.dat geschrieben wird oder?
wie komme ihc auf .bat : ich habe dafür von einer Kolleegin ein .Bat datei die die aufgabe meiner Python datei bislang getan hat.. aber bei dieser .bat treten hin und wieder fehler auf da es sich um ziemlich große datenmengen handelt.
"Im Burnout steckt viel Arbeit drin" -Lysander
@OttoPython: Wo ist denn jetzt das Problem mit `subprocess`? Da sind doch Beispiele wie man Programme aufruft und ihnen Argumente mitgibt. Aufruf heist auf Englisch „call” — und gleich die erste Funktion die in der Dokumentation zu dem Modul steht, heisst so. Was immer Du anstellst, verwende kein ``shell=True`` beim Aufruf.
- OttoPython
- User
- Beiträge: 47
- Registriert: Montag 23. April 2012, 14:14
habe den Befehl:
und bekomme dann
ich möchte doch nur dass die aktuelle Zeile an die exe übergeben wird was für argumente benötige ich? wenn cih die komplette liste der doku auf none reinsetze passiert das gleiche
Code: Alles auswählen
for elements in filenames:
subprocess.call(['bla.exe'])
Code: Alles auswählen
not enough arguments in call!
syntax: validate_cin <path> <file> [option]
Errorcode: 1
"Im Burnout steckt viel Arbeit drin" -Lysander
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Der Fehlercode spricht doch für sich! Wie würdest Du das Programm denn per Hand aufrufen? Da sollte Dir auffallen, dass Du den Dateinamen nicht angibst
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- OttoPython
- User
- Beiträge: 47
- Registriert: Montag 23. April 2012, 14:14
hab ich doch "bla.exe"
"Im Burnout steckt viel Arbeit drin" -Lysander
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Dann ruf doch mal `bla.exe` in einer Shell auf und vergleiche die Ausgabe mit der Fehlermeldung von `subprocess.call`OttoPython hat geschrieben:hab ich doch "bla.exe"
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- OttoPython
- User
- Beiträge: 47
- Registriert: Montag 23. April 2012, 14:14
Achso. Ich dachte Python würde die exe finden, da sich exe und .py im selbigen Verzeichnis befinden.
Ich hab den Pfad nun vollständig zur .exe eingegeben jedoch besteht die gleiche Fehlermeldung.
finde mich mit den ganzen anleitungen in der Doku und bei google nicht zurecht.
erwirkt gleiche fehlermeldung wie vorher.
Oder ist meine Übergabe nicht korrekt?
- Beim schreiben der Liste soll gleichzeitig subprocess die aktuelle Zeile an die exe weitergeben. liegt da bereits der Fehler?
Ich hab den Pfad nun vollständig zur .exe eingegeben jedoch besteht die gleiche Fehlermeldung.
finde mich mit den ganzen anleitungen in der Doku und bei google nicht zurecht.
Code: Alles auswählen
for elements in filenames:
subprocess.call("D:\\Test\test.exe")
Oder ist meine Übergabe nicht korrekt?
- Beim schreiben der Liste soll gleichzeitig subprocess die aktuelle Zeile an die exe weitergeben. liegt da bereits der Fehler?
Code: Alles auswählen
if filenames:
with open("list.dat", "w") as outfile:
outfile.write("\n".join(filenames))
for elements in filenames:
subprocess.call("D:\\Test\test.exe")
"Im Burnout steckt viel Arbeit drin" -Lysander
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Bingo! Darauf wollte ich hinausOttoPython hat geschrieben: Oder ist meine Übergabe nicht korrekt?
Du musst doch erst einmal den Aufruf des Programms separat von Python korrekt hinbekommen. Auch dort musst Du doch wohl einen *Parameter* übergeben... wenn Du das *nicht* tust, wirst Du dort dieselbe Fehlermeldung erhalten, wie `subprocess` sie Dir weiter leitet.
Schau Dir mal Deine Schleife an und sage mir, wo `elements` im Schleifenrumpf auftaucht...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- OttoPython
- User
- Beiträge: 47
- Registriert: Montag 23. April 2012, 14:14
uups alles klar.
die liste wird ja dadrüber erstellt und ich lasse ja nach files suchen also fliegt elements raus und files gehört an dessen stelle
richtig?
die liste wird ja dadrüber erstellt und ich lasse ja nach files suchen also fliegt elements raus und files gehört an dessen stelle
richtig?
"Im Burnout steckt viel Arbeit drin" -Lysander
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Hä? Kapiere ich nicht! `files` gibt es doch gar nicht?OttoPython hat geschrieben: die liste wird ja dadrüber erstellt und ich lasse ja nach files suchen also fliegt elements raus und files gehört an dessen stelle
richtig?
Ich versuche es mal so:
Code: Alles auswählen
for name in ["Sheldon", "Leonard", "Howard", "Raj"]:
print("Hallo", )
Hallo
Hallo
Hallo
Hallo
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- OttoPython
- User
- Beiträge: 47
- Registriert: Montag 23. April 2012, 14:14
Code: Alles auswählen
filenames = []
for root, dirs, files in os.walk(polpath):
filenames.extend(files)
if filenames:
with open("list.dat", "w") as outfile:
outfile.write("\n".join(filenames))
for i in filenames:
subprocess.call("D:\\Test\test.exe", filenames[i])
kann ich das mit i = int (filenames) machen?
"Im Burnout steckt viel Arbeit drin" -Lysander
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Whooozaaaa... *am Ohr reib*
Also mal ganz in Ruhe:
Mal abgesehen davon, dass `i` ein schlechter Name ist, was steht denn in `i` drin?
Noch ein Tipp:
Man iteriert in Python über die *Elemente* eines Iterables und nicht über einen Index! Das sind absolute Grundlagen; da Du dort massive Lücken zu haben scheinst, solltest Du dringend mal ein Tutorial durcharbeiten, um diese Lücken zu füllen. Das hätte Dir sofort auffallen können, indem Du (a) das alles mal in einer Shell getestet hättest, (b) Dir mit `print` mal das Objekt hinter `i` hättest ausgeben lassen oder drüber nachdenken können, was in der `for`-Schleife passiert, in der Du über die Ergebnisse von `os.walk` iterierst
Also mal ganz in Ruhe:
Code: Alles auswählen
for i in filenames:
subprocess.call("D:\\Test\test.exe", filenames[i])
Noch ein Tipp:
Code: Alles auswählen
for name in ["Sheldon", "Leonard", "Howard", "Raj"]:
print("Hallo", name)
Hallo Sheldon
Hallo Leonard
Hallo Howard
Hallo Raj
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- OttoPython
- User
- Beiträge: 47
- Registriert: Montag 23. April 2012, 14:14
wie die listen ausgabe funktioniert ist mir klar.
ja in i steht auch nix drin , i muss ja eigentlich files sein, da ja files jede einzelne zeile in filenames ist. nicht wahr ?
also files soll die aktuelle zeile in der liste sein.
funktioniert aber auch nicht. nun will mir python sagen das files für bufsize steht. ich versteh das anze konzept subprocess nicht
ja in i steht auch nix drin , i muss ja eigentlich files sein, da ja files jede einzelne zeile in filenames ist. nicht wahr ?
also files soll die aktuelle zeile in der liste sein.
Code: Alles auswählen
for i in filenames:
subprocess.call("D:\\Test\test.exe", files)
"Im Burnout steckt viel Arbeit drin" -Lysander
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Aber anscheinend nicht wirklich, denn ob ich im Rumpf ein Element ausgebe oder es anderweitig verwende macht doch semantisch keinen Unterschied!OttoPython hat geschrieben:wie die listen ausgabe funktioniert ist mir klar.
Hä? `files` ist doch nur ein Zwischenprodukt in Deiner ersten Schleife. In `filenames` samlest Du doch *alle* Dateinamen, die in Frage kommen! Vergiss doch einfach mal `files`. Zumal an `files` nur das Objekt des letzten Durchgangs der ersten `for`-Schleife gebunden ist... was Dir vermutlich gar nicht klar ist!?OttoPython hat geschrieben: ja in i steht auch nix drin , i muss ja eigentlich files sein, da ja files jede einzelne zeile in filenames ist. nicht wahr ?
Und in `i` sollte etwas drin stehen, sofern `filenames` nicht leer ist. Zudem würde es dann zu der von Dir geposteten Fehlermeldung nicht kommen
Naja, da ist zwar auch noch ein Fehler drin, aber das Hauptproblem ist, dass Du Python nicht annähernd ausreichend für die Problemlösung beherrschst! Du hast nicht einmal den richten Namen in den Aufruf geschrieben - abgesehen davon, dass man den Programmaufruf und die Parameter als Iterable übergeben muss.ich versteh das anze konzept subprocess nicht
Aber weil ich mal lieb bin:
Code: Alles auswählen
for name in filenames:
subprocess.call(["test.exe", name])
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- OttoPython
- User
- Beiträge: 47
- Registriert: Montag 23. April 2012, 14:14
so ich habs jetz mit der Commandline mal ohne den Subprocess durchgespielt.
Also ja in Filenames sind alle Dateien drin die in meinem Folder liegen.
In "name" ichs habs jetzt "data" genannt stehen nach
alle dateien untereinander aufgelistet. Das heißt ja in Data stehen die Dateinamen drin.
benutze ich jedoch
bekomme ich wieder den Fehlercode
Also ja in Filenames sind alle Dateien drin die in meinem Folder liegen.
In "name" ichs habs jetzt "data" genannt stehen nach
Code: Alles auswählen
for data in filenames:
print data
benutze ich jedoch
Code: Alles auswählen
for data in filenames:
subprocess.call(["D:\\Test\test.exe", data])
Code: Alles auswählen
not enough arguments in call!
syntax: validate_cin <path> <file> [option]
Errorcode: 1
Pause
"Im Burnout steckt viel Arbeit drin" -Lysander