Seite 1 von 1

subprocess mit variablen unter windows

Verfasst: Dienstag 16. Juli 2013, 09:40
von Praktikant03
Hallo ich versuche eine Funktion zu schreiben die den Hostnamen ändert unter Windows 7 aber komme nicht weiter.

Mein Ansatz:

Code: Alles auswählen

def changeHost(oldH, newH):
    subprocess.check_output("wmic computersystem where name=",oldH + "call rename name=",newH, shell=True)      # Windows Funktion um Hostnamen zu ändern
ich versteh einfach die Syntax nicht wie kann ich einen langen Befehl unterbrechen und zwei variablen einsetzten die auch noch in Anführungszeichen " " sind.

Ich könnte die Variablen vorher in Anführungszeichen setzten klar aber das unterbrechen dieses langen kommandos ist der Knackpunkt was nicht funktioniert.

Könnte mir da jemand helfen ?
Auch genial wenn ich den returncode abfangen könnte und wissen könnte ob der befehl erfolgreich war oder nicht

Danke vielmals für jede Mühe

Re: subprocess mit variablen unter windows

Verfasst: Dienstag 16. Juli 2013, 09:43
von BlackJack
@Praktikant03: Du möchtest wohl eher nicht ``shell=True`` verwenden und das ganze als Liste angeben. Dann sind sämtliche Sonderzeichen für die Shell, wie beispielsweise Anführungszeichen kein Problem, weil man das eben nicht mehr unbeschaded an einer Shell vorbeischleusen muss, sondern das Programm *direkt* startet.

Edit: Ungetestet:

Code: Alles auswählen

def change_host(old_hostname, new_hostname):
    subprocess.check_call(
        [
            'wmic', 'computersystem', 'where', 'name=' + old_hostname,
            'call', 'rename', 'name=' + new_hostname,
        ]
    )

Re: subprocess mit variablen unter windows

Verfasst: Dienstag 16. Juli 2013, 09:59
von Praktikant03
Hi danke für die schnelle Antwort aber irgendwie kommt dann so ein fehler

Code: Alles auswählen

oH = '"ttt'"                # aktueller hostname 
nH = '"MPC"'              # neuer hostname 

def change_host(old_hostname, new_hostname):
    subprocess.check_call(
        [
            'wmic', 'computersystem', 'where', 'name=' + old_hostname,
            'call', 'rename', 'name=' + new_hostname,
        ]
    )


change_host(oH, nH)   # kommt als Fehlermeldung
>>> change_host(oH, nH)
Knoten - TTT
FEHLER:
Beschreibung = Die Anfrage ist ungültig.


Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in change_host
File "C:\Python27\lib\subprocess.py", line 511, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['wmic', 'computersystem', 'where', 'name="ttt"', 'call', 'rename', 'name="MPC"']' returned non-zero exit status -2147217385

Re: subprocess mit variablen unter windows

Verfasst: Dienstag 16. Juli 2013, 10:02
von BlackJack
@Praktikant03: Lass mal die " *innerhalb* der Zeichenketten weg, denn die dürften eigentlich nur für die Shell sein, die ja nun nicht mehr dazwischen steht und die heraus filtert.

Und wenn Du vernünftige Namen verwendest, bräuchtest Du keine Kommentare die erklären was diese kryptischen Abkürzungen bedeuten.

Re: subprocess mit variablen unter windows

Verfasst: Dienstag 16. Juli 2013, 10:16
von Praktikant03
Hm sorry wegen den kryptischen Namen,

aber egal wie ich es drehe oder wende ob mit den Anführungszeichen oder nicht immer diese komische Fehlermeldung

Code: Alles auswählen

subprocess.CalledProcessError: Command '['wmic', 'computersystem', 'where', 'name=ttt', 'call', 'rename', 'name=MPC']' returned non-zero exit status -2147217385
Das Problem selbst wenn ich wie die Windows Funktion verlangt den name= "irgendwas" in Anführungsstrichen habe kommt die gleiche Meldung

Code: Alles auswählen

>>> new_host = '"MPC"'
>>> alt_host = '"ttt"'
>>> change_host(alt_host, new_host)
Knoten - TTT
FEHLER:
Beschreibung = Die Anfrage ist ungültig.


Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in change_host
  File "C:\Python27\lib\subprocess.py", line 511, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['wmic', 'computersystem', 'where', 'name="ttt"', 'call', 'rename', 'name="MPC"']' returned non-zero exit status -2147217385
Und hier sieht man ja, dass name mit den Anführungsstrichen ist desswegen die kryptischen ' " irgendwas " ' Hochkommata um eben den String mit " " zu bekommen.

hm..

Re: subprocess mit variablen unter windows

Verfasst: Dienstag 16. Juli 2013, 12:27
von Praktikant03
Es muss irgendwie an der Variablen übergabe scheitern, denn wenn ich

Code: Alles auswählen

subprocess.call('wmic computersystem where name="ttt" call rename name="MPC"')
eingebe funktioniert es ohne Problem doch habe ich hier "ttt" als alten Computernamen einfach eingetragen genau wie "MPC"

# Ausgabe des Befehlts

Code: Alles auswählen

(\\TTT\ROOT\CIMV2:Win32_ComputerSystem.Name="TTT")->rename() wird ausgeführt
Methode wurde ausgeführt.
Ausgabeparameter:
instance of __PARAMETERS
{
        ReturnValue = 0;
};

Re: subprocess mit variablen unter windows

Verfasst: Dienstag 16. Juli 2013, 12:56
von /me
Praktikant03 hat geschrieben:

Code: Alles auswählen

subprocess.call('wmic computersystem where name="ttt" call rename name="MPC"')
Wenn das geht, dann bau das Kommando doch einfach mit Stringformatierung zusammen.

Code: Alles auswählen

new_host = 'MPC'
alt_host = 'ttt'
command = 'wmic computersystem where name="{old_name}" call rename name="{new_name}"'.format(
    old_name = alt_host,
    new_name = new_host
)

Re: subprocess mit variablen unter windows

Verfasst: Dienstag 16. Juli 2013, 13:11
von Praktikant03
Ja @/me du hast recht so funktionierts perfekt vielen dank nochmal hab gar nicht an String formatierung gedacht.

Danke nochmal !

Super Forum thread kann geschlossen werden