.bat mit Listeninhalt ausführen

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.
Benutzeravatar
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
"Im Burnout steckt viel Arbeit drin" -Lysander
BlackJack

@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?
Benutzeravatar
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.

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()
funktioniert sauber. aber ich habe keine vorstellung wie ich jedes einzelne element übergeben kann in eine bat
"Im Burnout steckt viel Arbeit drin" -Lysander
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

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.
...
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.

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

OttoPython hat geschrieben:

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()
funktioniert sauber. aber ich habe keine vorstellung wie ich jedes einzelne element übergeben kann in eine bat
Na, so sauber ist das auch nicht...

- `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))
Du solltest Dir mal das `subprocess`-Modul angucken. Damit kannst Du externe Programme starten.

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
Benutzeravatar
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.
"Im Burnout steckt viel Arbeit drin" -Lysander
BlackJack

@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.
Benutzeravatar
OttoPython
User
Beiträge: 47
Registriert: Montag 23. April 2012, 14:14

habe den Befehl:

Code: Alles auswählen

for elements in filenames:
		subprocess.call(['bla.exe'])
und bekomme dann

Code: Alles auswählen

 not enough arguments in call!
 syntax: validate_cin <path> <file> [option]
 Errorcode:            1
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
"Im Burnout steckt viel Arbeit drin" -Lysander
Benutzeravatar
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
Benutzeravatar
OttoPython
User
Beiträge: 47
Registriert: Montag 23. April 2012, 14:14

hab ich doch "bla.exe"
"Im Burnout steckt viel Arbeit drin" -Lysander
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

OttoPython hat geschrieben:hab ich doch "bla.exe"
Dann ruf doch mal `bla.exe` in einer Shell auf und vergleiche die Ausgabe mit der Fehlermeldung von `subprocess.call` :roll:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
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. :(

Code: Alles auswählen

for elements in filenames:
     subprocess.call("D:\\Test\test.exe")
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?

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

OttoPython hat geschrieben: Oder ist meine Übergabe nicht korrekt?
Bingo! Darauf wollte ich hinaus ;-)

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
Benutzeravatar
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 :roll: und files gehört an dessen stelle
richtig?
"Im Burnout steckt viel Arbeit drin" -Lysander
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

OttoPython hat geschrieben: die liste wird ja dadrüber erstellt und ich lasse ja nach files suchen also fliegt elements raus :roll: und files gehört an dessen stelle
richtig?
Hä? Kapiere ich nicht! `files` gibt es doch gar nicht?

Ich versuche es mal so:

Code: Alles auswählen

for name in ["Sheldon", "Leonard", "Howard", "Raj"]:
    print("Hallo", )

Hallo
Hallo
Hallo
Hallo
Was wollte man wohl eigentlich sehen und was fehlt dafür?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
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])

TypeError :roll: wie soll ich daraus integer machen? filenames sind doch zeichenketten
kann ich das mit i = int (filenames) machen?
"Im Burnout steckt viel Arbeit drin" -Lysander
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Whooozaaaa... *am Ohr reib*

Also mal ganz in Ruhe:

Code: Alles auswählen

for i in filenames:        
    subprocess.call("D:\\Test\test.exe", filenames[i])
Mal abgesehen davon, dass `i` ein schlechter Name ist, was steht denn in `i` drin?

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
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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
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.

Code: Alles auswählen

for i in filenames:        
    subprocess.call("D:\\Test\test.exe", files)
funktioniert aber auch nicht. nun will mir python sagen das files für bufsize steht. ich versteh das anze konzept subprocess nicht :?
"Im Burnout steckt viel Arbeit drin" -Lysander
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

OttoPython hat geschrieben:wie die listen ausgabe funktioniert ist mir klar.
Aber anscheinend nicht wirklich, denn ob ich im Rumpf ein Element ausgebe oder es anderweitig verwende macht doch semantisch keinen Unterschied!
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 ?
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!?

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 :roll:
ich versteh das anze konzept subprocess nicht :?
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.

Aber weil ich mal lieb bin:

Code: Alles auswählen

for name in filenames:        
    subprocess.call(["test.exe", name])
Nun schau Dir das mal an und versuche wenigstens mal, die semantischen Unterschiede zu verstehen! (Und nein, es geht mir nicht um die verkürzte Pfadangabe ;-) )
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
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

Code: Alles auswählen

for data in filenames:
    print data
alle dateien untereinander aufgelistet. Das heißt ja in Data stehen die Dateinamen drin.

benutze ich jedoch

Code: Alles auswählen

for data in filenames:
    subprocess.call(["D:\\Test\test.exe", data])
bekomme ich wieder den Fehlercode

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
Antworten