Subprocess.call или Subprocess.Popen не могут использовать исполняемые файлы, которые находятся в PATH (Linux / Windows)

Я пишу программу, которая должна работать как на Linux, так и на Windows и использовать исполняемые файлы (с параметрами), которые существуют в пути. (Предположительно)

В настоящее время у меня возникают проблемы с запуском исполняемых файлов в Windows с помощью Subprocess.Call и Subprocess.Popen.

Для кода, подобного этому, в окнах 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) 

Я получаю сообщение об ошибке в консоли

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

Хотя я могу запустить ту же команду, используя cmd.exe, я получаю тот же ответ с shell = False.

Любые идеи о том, как я могу запустить команду, предполагая, что исполняемый файл находится в переменной среды PATH? благодаря

Вы можете управлять переменными среды, доступными в порожденном подпроцессе, передавая сопоставление с аргументом ключевого слова env . Например

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

Или наследовать PATH из PATH системной среды, не забирая все остальное из системной среды:

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

Однако проще или проще просто использовать абсолютный путь.

Хорошо, вот как я заработал.

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

Я боролся с этим сам, пока не нашел этот отчет об ошибке python .

«Если вы добавите каталог в PATH в Windows, чтобы каталог находился в кавычках, подпроцесс не находит в нем исполняемые файлы». Поскольку кавычки не требуются при удалении окон, они исправляют мою проблему (в версии 2.7).