我正在尝试从 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 命令行中以 python.exe main.py
(这是 Arc 的 2.6 版 python)运行 main.py
时,一切正常。但是,如果我采用相同的脚本并将其添加为主应用程序中的“工具箱”并从那里启动它,我会在 import_tests.py
中得到 GDAL lib 的“DLL not found”文件!
当 subprocess
是启动不同 Python 解释器的模块时,这怎么会发生呢?对可能发生的事情有什么想法吗?
编辑:我可以验证 os.environ['PATH']
变量在两个调用中是否相同。
Edit2: C:\Program Files\ArcGIS...\Bin
目录包含一个与我的 python 绑定(bind)不兼容的 dll。 Windows 首先搜索 cwd 并尝试加载该 dll,失败,然后报告“找不到 dll”错误。
最佳答案
不管 PATH 是否正确,一个简单的测试是切换到不同的任意目录并执行 python.exe C:\full\path\to\main.py
。如果这重现了问题,那么您就知道这是某种路径问题。
检查 sys.path ,我敢打赌这就是区别所在。如果是这种情况,您可能需要更改使 Python 代码和库可从 python.exe
访问的方式,使用 site module或使用其他类似 zc.buildout 的东西/zc.recipe.egg支持生成包含正确 sys.path 的控制台脚本。
关于python - 启动 python 子进程有不同的行为,具体取决于启动器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7115107/