Question

Je suis en cours d'exécution un programme d'installation msi en mode silencieux et les journaux de mise en cache dans le fichier spécifique. Ce qui suit est la commande que je dois exécuter.

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

je:

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

pour exécuter la commande mais il ne reconnaît pas l'opération et donne erreur sur mauvaise option sélectionnée. Je croix vérifié et constaté que la commande ne fonctionne que de cette façon.

Était-ce utile?

La solution

Le problème est très subtil.

Vous exécuter le programme directement. Il obtient:

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

considérant qu'il devrait être:

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

En d'autres termes, il devrait recevoir 5 arguments, pas deux arguments.

En outre, %TEMP% est inconnu directement au programme!

Il y a 2 façons de résoudre ce problème:

  1. Appel du 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. appeler directement le programme (plus sûr)

    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]
    

Autres conseils

Le problème est que vous fournissez efficacement Setup.exe avec un seul argument. Ne pensez pas en termes de la coquille, la chaîne que vous remettiez comme argument ne soit pas coupée sur les espaces Plus, qui est de votre devoir!

Donc, si vous êtes absolument sûr que "/ qn / lv% TEMP% \ log_silent.log" devrait être un argument, puis utilisez ceci:

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

Dans le cas contraire (je suppose que celui-ci sera correcte), utilisez ceci:

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

Essayez de mettre chaque argument dans sa propre chaîne (reformaté pour une meilleure lisibilité):

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

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

Je dois dire que, ces guillemets doubles ne regardez pas dans les bons endroits pour moi.

Vous avez dit:

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

est le nom du répertoire vraiment « Mon installation » (avec un espace de premier plan)?

En outre, en règle générale, vous devez utiliser des barres obliques dans les spécifications de chemin. Python doit les gérer de façon transparente (même sous Windows) et vous éviter tout problème avec python interprétation antislashs comme des caractères d'échappement.

(par exemple:

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

)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top