Subprocess.call或Subprocess.Popen不能使用PATH(Linux / Windows)中的可执行文件

我正在编写一个程序,需要在Linux和Windows上运行,并使用path中存在的可执行文件(带有参数)。 (假定)

目前,我在使用Subprocess.Call和Subprocess.Popen在Windows中运行可执行文件时遇到问题。

对于这样的代码,在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) 

我在控制台中收到错误消息

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

尽pipe我可以使用cmd.exe运行相同的命令,但是我得到了与shell = False相同的响应。

关于如何运行命令的任何想法,假设可执行文件在PATH环境variables中? 谢谢

Solutions Collecting From Web of "Subprocess.call或Subprocess.Popen不能使用PATH(Linux / Windows)中的可执行文件"

您可以通过使用env关键字参数传递映射来控制生成的子流程中可用的环境变量。 例如

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

或者从系统环境变量继承PATH ,而不必从系统环境中夹紧其他任何东西:

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

不过,使用绝对路径可能会更简单/更简单。

好的,这里是我如何工作。

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

我自己一直在努力,直到找到这个python bug报告 。

“如果您在Windows中将目录添加到PATH中,以便目录位于引号中,则子流程不会在其中找到可执行文件。” 由于引号是不需要的窗口删除他们修复了我的问题(在2.7)。