Seite 1 von 1

subprocess, Kommandozeile

Verfasst: Freitag 30. Juli 2010, 11:36
von Time_O
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

Re: subprocess, Kommandozeile

Verfasst: Freitag 30. Juli 2010, 12:37
von 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.

Re: subprocess, Kommandozeile

Verfasst: Freitag 30. Juli 2010, 12:41
von Leonidas
Und eigentlich willst du nicht ``cmd`` starten sondern ``ipconfig``.

Re: subprocess, Kommandozeile

Verfasst: Freitag 30. Juli 2010, 16:54
von Dav1d
Und subprocess nimmt eine Liste als 1. Argument:

Code: Alles auswählen

subprocess.Popen([])

Re: subprocess, Kommandozeile

Verfasst: Freitag 30. Juli 2010, 17:14
von ms4py
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()

Re: subprocess, Kommandozeile

Verfasst: Sonntag 1. August 2010, 12:04
von Time_O
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 :(

Re: subprocess, Kommandozeile

Verfasst: Sonntag 1. August 2010, 12:16
von Time_O
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 ?

Re: subprocess, Kommandozeile

Verfasst: Sonntag 1. August 2010, 12:24
von 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.

Re: subprocess, Kommandozeile

Verfasst: Sonntag 1. August 2010, 12:35
von Time_O
OKay, das macht sinn :oops:

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