subprocess, Kommandozeile

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.
Antworten
Time_O
User
Beiträge: 5
Registriert: Dienstag 18. Mai 2010, 19:43

Zuerstmal sry für die Anfängerfrage *schäm* :roll:

Wie ich mit dem subprocess modul die Kommandozeile öffne weiß ich.

Code: Alles auswählen

 subprocess.Popen('cmd')
Gibt es jetzt einen Weg das Pythonproramm automatisch etwas in die Kommandozile eintragen zu lassen und das Ergebnis im Programm auszugeben ? Ich hab das so verstanden, das ich um in cmd was eintragen zu können, stdin, stdout und stderr = PIPE setzen muss. Und dann ? Ich dachte das get mit communicate, z.B.

Code: Alles auswählen

c = subprocess.Popen('cmd', stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) 
c.communicate('ipconfig/all')
Das geht nicht, da "communicate" nicht mit Strings arbeitet :/ ( Was es laut dem Library Eintrag aber müsste :? )

Fehlermeldung :Traceback (most recent call last):
File "C:\Python31\Meine scripts\subprocess_cmd2.py", line 6, in <module>
c.communicate('ipconfig/all')
File "C:\Python31\lib\subprocess.py", line 727, in communicate
return self._communicate(input)
File "C:\Python31\lib\subprocess.py", line 937, in _communicate
self.stdin.write(input)
TypeError: must be bytes or buffer, not str

Idiotenfreundiche Hilfe bitte :P
BlackJack

@Time_O: Du hast wahrscheinlich in der falschen Dokumentation geschaut. In Python 3.x ist `str` etwas anderes als in Python 2.x. Du musst da in Python 3.x etwas vom Typ `bytes` übergeben. Arbeite am besten mal das Tutorial in der Dokumentation durch.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Und eigentlich willst du nicht ``cmd`` starten sondern ``ipconfig``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Und subprocess nimmt eine Liste als 1. Argument:

Code: Alles auswählen

subprocess.Popen([])
the more they change the more they stay the same
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Das soll wohl so aussehen:

Code: Alles auswählen

from subprocess import Popen, PIPE

p = Popen(['ipconfig', '/all'], stdout=PIPE)
p.wait()
output = p.stdout.read()
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Time_O
User
Beiträge: 5
Registriert: Dienstag 18. Mai 2010, 19:43

Okay, ich glaub ich werd die Dokumentation nochmal durcharbeiten, von wegen 'str' und so.
ms4py hat geschrieben:
Das soll wohl so aussehen:

Code:
from subprocess import Popen, PIPE

p = Popen(['ipconfig', '/all'], stdout=PIPE)
p.wait()
output = p.stdout.read()
Da passiert bei mir nichts, die Blackbox erscheint kurz, aber ansonsten gibt das Programm nichts aus :(
Time_O
User
Beiträge: 5
Registriert: Dienstag 18. Mai 2010, 19:43

BlackJack hat geschrieben:@Time_O: Du hast wahrscheinlich in der falschen Dokumentation geschaut. In Python 3.x ist `str` etwas anderes als in Python 2.x. Du musst da in Python 3.x etwas vom Typ `bytes` übergeben. Arbeite am besten mal das Tutorial in der Dokumentation durch.
Okay, was bytes sind weiß ich, aber 'str' ist doch bei Python 3.x und 2.x ein Datentyp oder nicht ?
BlackJack

@Time_O: Natürlich gibt das Programm nichts aus. Es ist ja auch nirgendwo eine Anweisung oder Funktion die `output` ausgibt.

Und wenn die "Blackbox" nur kurz erscheint, dann solltest Du das Programm auch in der Konsole starten und nicht durch draufklicken. Siehe die FAQ zum Starten von Programmen.
Time_O
User
Beiträge: 5
Registriert: Dienstag 18. Mai 2010, 19:43

OKay, das macht sinn :oops:

Ich bin halt noch sehr unefahren und heute auch irgendwie unkonzentriert.
Antworten