Pregunta

Me postulo un instalador MSI en el modo de almacenamiento en caché y los registros silenciosos en el archivo específico. El siguiente es el comando que necesito para ejecutar.

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

He utilizado:

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

para ejecutar el comando sin embargo, no reconoce la operación y da error con respecto a la opción seleccionada equivocada. He cruzada verificado y se encontró que el comando sólo funciona de esta manera.

¿Fue útil?

Solución

El problema es muy sutil.

Usted está ejecutando el programa directamente. Se obtiene:

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

Considerando que debe ser:

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

En otras palabras, se debe recibir 5 argumentos, no los 2 argumentos.

Además, %TEMP% es directamente desconocido para el programa!

Hay 2 maneras de solucionar este problema:

  1. Llamar a la cáscara.

    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. directamente llamar programa (más seguro)

    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]
    

Otros consejos

El problema es que se proporciona de manera efectiva Setup.exe con sólo un argumento. No pensar en términos de la cáscara, la cadena de entregar como un argumento no quede dividido en espacios más, que es su deber!

Por lo tanto, si está absolutamente seguro de que "/ qn / lv% TEMP% \ log_silent.log" debería ser un argumento, a continuación, utilice la siguiente:

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

En caso contrario (supongo que éste será correcto), utilice la siguiente:

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

Trate de poner cada argumento en su propia cadena (reordenada para facilitar la lectura):

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

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

Tengo que decir, no obstante, esas comillas dobles no se ven en los lugares correctos para mí.

Usted dijo:

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

es el nombre de directorio de verdad "Mi Instalador" (con un espacio inicial)?

También, como regla general, se debe utilizar barras diagonales en las especificaciones de ruta. Python debe manejarlos sin problemas (incluso en Windows) y evitar cualquier problema con la interpretación de pitón barras invertidas como caracteres de escape.

(por ejemplo:

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

)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top