Ответ 1
Хорошо, вот как я заработал.
env = os.environ
proc = subprocess.Popen(args, env=env)
Я пишу программу, которая должна работать как на 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 = os.environ
proc = subprocess.Popen(args, env=env)
Вы можете управлять переменными среды, доступными в порожденном подпроцессе, передавая сопоставление с аргументом ключевого слова env
. Например
proc = subprocess.Popen(args, env={'PATH': '/some/path'})
Или наследовать PATH
из PATH
системной среды, не забирая все остальное из системной среды:
proc = subprocess.Popen(args, env={'PATH': os.getenv('PATH')})
Однако проще или проще просто использовать абсолютный путь.
Я боролся с этим сам, пока не нашел этот отчет об ошибке python.
"Если вы добавите каталог в PATH в Windows, чтобы каталог находился в кавычках, подпроцесс не находит в нем исполняемые файлы". Поскольку кавычки не требуются при удалении окон, они исправляют мою проблему (в версии 2.7).
Мой коллега воспроизвел эту проблему с Python 3.6.5 на 64-битной Windows 10.
Однако установленная версия Python была 32-битной.
Переустановка 64-битной версии Python исправила эту проблему.