Frage

Ich betreiben einen MSI-Installer im Silent-Modus und Caching-Protokolle in der Datei ist. Im Folgenden ist der Befehl, ich brauche auszuführen.

C:\Program Files\ My Installer\Setup.exe /s /v "/qn /lv %TEMP%\log_silent.log"

I verwendet:

subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s /v "/qn /lv %TEMP%\log_silent.log"'],stdout=subprocess.PIPE).communicate()[0]

auszuführen, um den Befehl aber es nicht um den Betrieb zu erkennen und gibt Fehler falsche Option bezüglich ausgewählt. Ich habe Querüberprüft und festgestellt, dass der Befehl auf diese Weise nur funktioniert.

War es hilfreich?

Lösung

Das Problem ist sehr subtil.

Sie Ausführung des Programms direkt. Es wird:

argv[0] = "C:\Program Files\ My Installer\Setup.exe"
argv[1] = /s /v "/qn /lv %TEMP%\log_silent.log"

Während es sollte sein:

argv[1] = "/s"
argv[2] = "/v"
argv[3] = "/qn"
argv[4] = "/lv %TEMP%\log_silent.log"

Mit anderen Worten, sollte es 5 Argumente erhält, nicht mehr als 2 Argumente.

Auch %TEMP% ist, um das Programm direkt unbekannt!

Es gibt zwei Möglichkeiten, dieses Problem zu beheben:

  1. Der Aufruf des Shell.

    p = subprocess.Popen('C:\Program Files\ My Installer\Setup.exe /s /v "/qn /lv %TEMP%\log_silent.log"', shell=True)
    output = p.communicate()[0]
    
  2. direkt anrufen Programm (sicherer)

    s = ['C:\Program Files\ My Installer\Setup.exe', '/s /v "/qn /lv %TEMP%\log_silent.log"']
    safes = [os.path.expandvars(p) for p in argument_string]
    p = subprocess.Popen(safes[0], safes[1:])
    output = p.communicate()[0]
    

Andere Tipps

Das Problem ist, dass Sie effektiv Setup.exe mit nur einem Argumente liefern. Denken Sie nicht, in Bezug auf die Schale, Sie die Zeichenfolge übergeben als Argument nicht mehr auf die Felder aufgeteilt bekommt, das ist Ihre Pflicht!

Also, wenn Sie absolut sicher ist, dass "/ qn / lv% TEMP% \ log_silent.log" sollte ein Argument sein, dann verwenden:

subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s', '/v', '/qn /lv %TEMP%\log_silent.log'],stdout=subprocess.PIPE).communicate()[0]

Im anderen Fall (Ich denke, das wird man richtig sein), verwenden Sie diese:

subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s', '/v', '/qn', '/lv', '%TEMP%\log_silent.log'],stdout=subprocess.PIPE).communicate()[0]

Versuchen Sie, jedes Argument in seinem eigenen String setzen (zur besseren Lesbarkeit umformatiert):

cmd = ['C:\Program Files\ My Installer\Setup.exe',
       '/s',
       '/v',
       '"/qn',
       '/lv',
       '%TEMP%\log_silent.log"']

subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]

Ich muß allerdings sagen, diese doppelten Anführungszeichen an den richtigen Stellen zu uns sehen nicht.

Sie haben gesagt:

subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s /v "/qn /lv %TEMP%\log_silent.log"'],stdout=subprocess.PIPE).communicate()[0]

Ist der Verzeichnisname "My Installer" (mit einem führenden Leerzeichen) wirklich?

Auch als allgemeine Regel sollten Sie Schrägstriche in Pfadangaben verwenden. Python sollte sich problemlos handhaben (auch unter Windows) und vermeiden Sie Probleme mit Python Schrägstriche als Escape-Zeichen interpretiert werden.

(zum Beispiel:

>>> s = 'c:\program files\norton antivirus'
>>> print s
c:\program files
orton antivirus

)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top