启动python子进程具有不同的行为,具体取决于启动器

时间:2011-08-18 22:54:55

标签: python subprocess arcgis gdal

我正在尝试从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批处理脚本,可以激活我想要的2.5版Python,同时还可以设置一些环境变量:

@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.pypython.exe main.py(这是Arc的2.6版本的python)时,一切正常。但是,如果我使用相同的脚本并将其作为“工具箱”添加到主应用程序中并从那里启动它,我会在import_tests.py文件中找到“找不到DLL”GDAL库!

subprocess是启动不同Python解释器的模块时,怎么会发生这种情况?关于可能发生什么的任何想法?

修改:我可以验证两个电话中os.environ['PATH']个变量是否相同。

Edit2: C:\Program Files\ArcGIS...\Bin目录包含一个与我的python绑定不兼容的dll。 Windows首先搜索cwd并尝试加载该DLL,失败,然后报告“未找到dll”错误。

2 个答案:

答案 0 :(得分:1)

无论PATH是否正确,一个简单的测试就是更改为不同的任意目录并执行python.exe C:\full\path\to\main.py。如果它再现了问题,那么你知道它是路径问题的某种

检查sys.path,我敢打赌这就是差异所在。如果是这种情况,您可能需要改变您使用python.exe访问Python代码和库的方式,使用site module或使用其他内容,例如zc.buildout / {{3支持生成带有正确的sys.path的console_scripts。

答案 1 :(得分:1)

从其他地方发布的评论中可以看出

  

“工作的是C:\ Windows,破坏的是C:\ Program Files \ ArcGIS ... \ Bin。”

执行os.chdir使其正常运行。

[不知道这究竟意味着什么,评论很难解析。]