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

标签 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 批处理脚本,它可以启动我想要的 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/

相关文章:

polygon - 如何计算多边形中特定大小区域的数量

python - 正则表达式:捕获一组具有相同开头的行?

Java:通过进程控制浏览器

python - 从另一个脚本启动一个 python 脚本,参数在 subprocess 参数中

python - 从 subprocess.Popen 打开另一个 python 3 进程将语言环境默认编码设置为 ANSI_X3.4-1968 但仅在某些情况下

android - 在 Android 上将 ShapefileFeatureTable 与 ArcGIS 一起使用时找不到文件异常

javascript - 在 ArcGIs 中创建类似 Google 的数字图钉

python - 如何在 pygame 中获取两个碰撞的 Sprite 对象?

python - 如何在 SQLAlchemy 中添加 UniqueConstraint

python - IBAN 掩码的正则表达式