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? благодаря

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

Мой коллега воспроизвел эту проблему с Python 3.6.5 на 64-битной Windows 10.

Однако установленная версия Python была 32-битной.

Переустановка 64-битной версии Python исправила эту проблему.