Befehl aus Python in CMD 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.
Antworten
Luggi
User
Beiträge: 8
Registriert: Freitag 29. Dezember 2017, 11:12

Hi,
ich versuche jetzt schon seid längerem einen befehl aus einem Python Programm in die Windows CMD zu übergeben und dort auszuführen.
Unter UNIX ist das alles kein Problem, ich brauche diese Funktion aber unter Windows :cry:.
Ich denke das das eigentlich mit subprocess gegen sollte.
Bisher hatte ich die befehle in eine Bash datei geschrieben und die dann ausgeführt, das macht aber für 2 befehle nicht wirklich sinn.

Vielleicht kann mir ja einer von euch helfen, ich komme gerade einfach irgendwie nicht weiter.

Schon mal vielen Dank
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Wie machst du es dnen unter UNIX? Denn eigentlich sollte es da keinen Unterschied geben. Subprocess verhält sich auf allen Systemen gleich.
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Am besten stellst du mal den exakten subprocess Aufruf hier rein. Dann lässt sich bestimmt mehr sagen.
Luggi
User
Beiträge: 8
Registriert: Freitag 29. Dezember 2017, 11:12

Danke :D
Ich bin weitergekommen xD

Jetzt muss ich das nur noch in mein Programm einbauen.
Bleibt natürlich nicht bei dem Ping war aber ganz gut zum Testen :)

Code: Alles auswählen

import subprocess
test = subprocess.Popen(["ping","www.google.de"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = test.communicate()
status = test.wait()

print(output)
Soll dann später einen Anmeldung an einem Netzlaufwerk realisieren.

Code: Alles auswählen

acces= subprocess.Popen(["net use E: \\%SERVER%\laufwerkXY/USER:%user% %password% %NUOPT%"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
	output, error = acces.communicate()
	status = acces.wait()
	
Das funktioniert leider noch nicht aber bin schon mal weiter :geek:

Der Beitrag hat mir trotzdem geholfen :D
Also schon mal danke
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Kommando ist auch so falsch angegeben. Du benutzt eine Liste, aber dann ist darin nur EIN String, mit ganz vielen Leerzeichen und Argumenten. Das ist ein Fehler. Da muss jedes Element des Aufrufs ein einzelnes Element der Liste sein, so wie du das beim ping ja auch korrekt gemacht hast.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Bei deinem Test hast du verstanden, dass die einzelnen Elemente des Kommandos auch einzeln Elemente der Liste sind, die subprocess übergeben werden.
In deinem zweiten Versuch tust du das dann einfach nicht mehr, sondern übergibst das komplette Kommando als einziges Element einer Liste. Das ist nicht richtig.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich weiß nicht, woher Du die Environment-Variablen hast (vor allem %password% sollte man ja nicht so setzen), die mußt Du aber selbst auflösen, in Python, wenn Du mit subprocess arbeiten willst. Und natürlich jeden Parameter als eigenen Listeneintrag. Ich denke, zwischen XY und /USER fehlt da auch noch die Trennung.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und die Umgebungsvariablen muss man natürlich auch selbst auflösen und einsetzen. Denn das wird ja nicht ”in” cmd.exe ausgeführt, sondern direkt. Was auch gut so ist, denn da ist nichts enthalten was wirklich die cmd.exe als Zwischenschritt benötigt. Und das ist unter Linux genau so. Da hätte das auch so nicht funktioniert.

In neuem Code sollte man auch `subprocess.run()` verwenden wenn man nicht tatsächlich ein `Popen`-Objekt braucht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Der Aufruf müsste also ungefähr so aussehen (ungetestet):

Code: Alles auswählen

    ...
    result = subprocess.run(
        [
            "net",
            "use",
            "E:",
            fr"\\{os.environ['SERVER']}\laufwerkXY",
            f"/USER:{os.environ['user']}",
            os.environ("password"),
            os.environ("NUOPT"),
        ],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        check=True,
    )
    ...
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten