Subprocess.call o Subprocess.Popen no pueden usar archivos ejecutables que están en PATH (Linux / Windows)

Estoy escribiendo un progtwig que debe ejecutarse tanto en Linux como en Windows y usar ejecutables (con parámetros) que existen en la ruta. (Ficticio)

Actualmente estoy teniendo problemas para ejecutar ejecutables en Windows usando Subprocess.Call y Subprocess.Popen.

Para un código como este, en windows 8.

def makeBlastDB(inFile, inputType, dbType, title, outDir): strProg = 'makeblastdb' strInput = '-in ' + inFile strInputType = '-input_type ' + inputType strDBType = '-dbtype ' + dbType strTitle = '-title ' + title strOut = '-out ' + os.path.join(os.sep, outDir, title) cmd = [strProg, strInput, strInputType, strDBType, strTitle, strOut] result = Popen(cmd, shell=True) 

Recibo el mensaje de error en la consola.

 'makeblastdb' is not recognized as an internal or external command, operable program or batch file. 

Aunque puedo ejecutar el mismo comando usando cmd.exe, obtengo la misma respuesta con shell = False.

¿Alguna idea sobre cómo puedo ejecutar el comando asumiendo que el ejecutable está en la variable de entorno PATH? Gracias

Puede controlar las variables de entorno disponibles en el subproceso generado al pasar una asignación con el argumento de la palabra clave env . P.ej

 proc = subprocess.Popen(args, env={'PATH': '/some/path'}) 

O para heredar PATH de la variable de entorno del sistema, sin necesariamente eliminar todo lo demás del entorno de sistema:

 proc = subprocess.Popen(args, env={'PATH': os.getenv('PATH')}) 

Sin embargo, podría ser más fácil / más simple usar una ruta absoluta.

Ok, aquí es cómo lo hice funcionar.

 env = os.environ proc = subprocess.Popen(args, env=env) 

Luché con esto yo mismo hasta que encontré este informe de error de Python .

“Si agrega un directorio en PATH en Windows para que el directorio esté entre comillas, el subproceso no encuentra ejecutables en él”. Como las citas no son necesarias para que Windows las elimine, soluciona mi problema (en 2.7).

Un colega mío ha reproducido este problema con Python 3.6.5 en Windows 10 de 64 bits.

La versión instalada de Python fue sin embargo de 32 bits.

La reinstalación de la versión de 64 bits de Python solucionó este problema.