14

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

目前,我在使用 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.

即使我可以使用 cmd.exe 运行相同的命令,我也会得到与 shell=False 相同的响应。

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

4

4 回答 4

8

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

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

或者从系统环境变量继承PATH,而不必从系统环境中插入其他所有内容:

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

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

于 2013-02-04T02:12:10.147 回答
7

好的,这就是我如何让它工作的。

env = os.environ
proc = subprocess.Popen(args, env=env)
于 2013-02-22T03:31:05.420 回答
5

我自己一直在努力解决这个问题,直到找到这个 python 错误报告

“如果您在 Windows 上将目录添加到 PATH 中,以便该目录包含在引号中,则子进程在其中找不到可执行文件。” 由于 Windows 不需要引号,因此删除它们可以解决我的问题(在 2.7 中)。

于 2013-06-14T17:03:58.283 回答
0

我的一位同事在 Windows 10 64 位上使用 Python 3.6.5 重现了这个问题。

然而,安装的 Python 版本是 32 位的。

重新安装 64 位版本的 Python 解决了这个问题。

于 2018-12-12T10:33:27.430 回答