【问题标题】:Launching python subprocess has different behavior depending on launcher启动 python 子进程具有不同的行为,具体取决于启动器
【发布时间】:2011-10-30 05:10:54
【问题描述】:

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

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

编辑:我可以验证两个调用中的os.environ['PATH'] 变量是否相同。

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

【问题讨论】:

  • 您在主应用程序中使用什么 GUI? gdal 尝试加载哪些 dll?它们中的任何一个都加载成功了吗?
  • 主要的 GUI 是 ArcGIS。据我所知gdal 尝试加载gdal.dll,但我不确定我会如何找到。我该如何检查?
  • 您可以使用Process Explorer 查看特定进程加载了哪些DLL。在这种情况下,您可能需要检查 ArcGIS 和所有 Python 进程。鉴于您最初的问题,我想说 ArcGIS 最有可能毒害了某些东西,不是 python。

标签: python subprocess arcgis gdal


【解决方案1】:

不管 PATH 是否正确,一个简单的测试是切换到不同的任意目录并执行python.exe C:\full\path\to\main.py。如果这重现了问题,那么您就知道这是某种路径问题。

检查sys.path,我敢打赌这就是区别所在。如果是这种情况,您可能需要更改使您的 Python 代码和库可从 python.exe 访问的方式,使用 site module 或使用其他类似 zc.buildout/zc.recipe.egg 对生成控制台脚本的支持包含正确的 sys.path。

【讨论】:

  • 感谢您的帮助,但两个调用之间的 sys.path 是相同的,只是多了一个目录。如果我手动删除该目录,我仍然会收到相同的错误。我也试过像你建议的那样通过绝对路径调用脚本,但仍然没有。你有什么其他的想法我可以检查一下吗?
  • 是的,这就是问题所在。显然,从 GUI 运行时的 cwd 位于具有不同版本的同一 dll 的目录中。当我从该目录更改到其他任何地方时,事情又开始了。
【解决方案2】:

从其他地方发布的 cmets 看来,

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

做一个os.chdir 让它工作。

[不知道这到底是什么意思,评论很难解析。]

【讨论】:

  • C:\Program Files\ArcGIS...\Bin 目录包含一个与我的 python 绑定不兼容的 dll(我不知道为什么,windows 不是我的东西)。 Windows首先搜索cwd并尝试加载该dll,失败,然后报告“找不到dll”错误。
  • @Rich:这种信息不属于评论。这是问题的基本部分。请更新问题以包含这一基本事实。
猜你喜欢
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
相关资源
最近更新 更多