根据启动器不同,Python子进程行为不同

4 投票
2 回答
1736 浏览
提问于 2025-04-16 23:55

我正在尝试从Python 2.6启动Python 2.5。这样做的原因是我想使用的一个编译库(GDAL)不支持与另一个程序(ArcGIS)一起分发的Python版本。

这是我想做的事情。在Python 2.6中的main.py文件:

import subprocess
p = subprocess.Popen(['C:\OSGeo4W\gdal_python_exec.bat', 'X:\\local\\import_tests.py'])

gdal_python_exec.bat是一个Windows批处理脚本,它可以启动我想要的Python 2.5版本,同时设置一些环境变量:

@echo off
set OSGEO4W_ROOT=C:\OSGeo4W
PATH=%OSGEO4W_ROOT%\bin;%PATH%
for %%f in (%OSGEO4W_ROOT%\etc\ini\*.bat) do call %%f
@echo on

@C:\OSGeo4W\bin\python.exe %1

import_tests.py尝试导入gdal库:

try:
    from osgeo import gdal
    raw_input('Imported! (Press enter)')
except Exception, e:
    print(e)
    raw_input('Failed! (Press enter)')

当我在DOS命令行中运行main.py,命令是python.exe main.py(这是ArcGIS的2.6版本的Python),一切正常。然而,如果我把同样的脚本作为“工具箱”添加到主应用程序中并从那里启动,就会出现“找不到DLL”的错误,指向import_tests.py文件中的GDAL库!

这怎么会发生呢?明明是subprocess模块在启动一个不同的Python解释器。有没有人知道可能发生了什么?

编辑:我可以确认在两次调用中os.environ['PATH']变量是一样的。

编辑2:C:\Program Files\ArcGIS...\Bin目录中有一个与我的Python绑定不兼容的DLL。Windows首先搜索当前工作目录,并尝试加载那个DLL,但失败了,然后报告了“找不到DLL”的错误。

2 个回答

1

从其他地方的评论来看,

“正常的路径是 C:\Windows,而出问题的路径是 C:\Program Files\ArcGIS...\Bin。”

你可以使用 os.chdir 来让它正常工作。

[我也不太明白这是什么意思,这条评论有点难懂。]

1

不管你的路径设置是否正确,可以先试试换个随便的文件夹,然后运行 python.exe C:\full\path\to\main.py。如果这样也出现问题,那就说明可能是路径方面出了问题。

你可以检查一下 sys.path,我敢打赌问题就出在这里。如果真是这样,你可能需要调整一下让你的Python代码和库能被 python.exe 访问的方法,可以使用 site模块,或者用其他工具,比如 zc.buildout 或者 zc.recipe.egg 来生成带有正确sys.path的控制台脚本。

撰写回答