【问题标题】:ImportError DLL load failed, but import at command line worksImportError DLL 加载失败,但在命令行导入有效
【发布时间】:2018-07-28 13:35:05
【问题描述】:

我正在尝试让 python 程序在 Windows 机器上运行。 我让它在我的开发窗口框中运行,但是当我将它转移到另一个窗口框时,我不断得到:

ImportError: DLL 加载失败:%1 不是有效的 Win32 应用程序

跟踪表明它在导入时遇到了问题,它基本上是通过几个内部 python 程序(相互导入)然后进入 ArcPy 领域。最终它似乎尝试过的最后一个是 arcgisscripting。

当我在那个框中输入解释器并输入“import arcgisscripting”时,我没有收到任何错误(只是一个新的 >>> 光标),所以我开始认为这个错误有点误导。如果(例如)python 代码编译为 64 位并且您尝试在 32 位 python 上运行,我会读到此错误。

一位同事建议,如果python找不到一些必要的代码,有时会发生错误。所以我检查并做了 SET 语句,现在 PATH 和 PYTHONPATH 变量似乎是等价的。我仍然收到此错误,不知道该怎么办。我宁愿不必做诸如卸载问题框上的东西并重新安装之类的事情。该框是共享资源。

【问题讨论】:

  • 目标机器上是否只安装了一个 Python 版本?
  • 这可能有帮助吗:stackoverflow.com/questions/8597126/…
  • @Karila 我相信目标框上只有一条蟒蛇。在我的盒子上有两条蟒蛇(2.6 和 2.7),我用 2.7 运行它。在目标框上我看到 2.7。
  • @zeffii 如果我的 ArcPy 代码是 64 位而不是 32 位编译的,当我输入“import arcgisscripting”时,解释器不会出错吗?
  • importing without error 是一个好的开始,但我遇到了仍然无法使用导入模块的情况。你可能想做的不仅仅是在 shell 中导入,看看你是否可以检查它。

标签: python windows dll import


【解决方案1】:

终于找到了。 arcgisscripting 的 .pyd 文件(基本上是特定于 python 的 .dll)位于 C:\Program Files (x86)\ArcGIS\Desktop10.1\bin\arcgisscripting.pyd

如果我将 DependencyWalker 指向该文件,则表明找不到该文件的多个依赖项。

看来解决方案是: 1) 找到 ImportError 标记的最后一个文件 2) 在文件系统上查找它的 .pyd 文件 3) 在该 .pyd 上运行 DependencyWalker 以找出缺少的内容

【讨论】:

  • 嗯...当我查找 DependencyWalker 说丢失的一些 .dll 时,看起来其他标记它们的人也发现他们是红鲱鱼。也许 DependencyWalker 毕竟不是一个很好的诊断工具......
  • 原来是安装ArcGIS软件的问题。重新安装 ArcGIS 后,问题就消失了。
【解决方案2】:

我最近从经历同样的痛苦中吸取了一些教训。

首先要运行几个检查。

  1. 检查所有组件是否在相同的操作系统基础上运行,64 位或 32 位。如果您的机器是 64 位安装,请确保您有 64 位版本的 python。 Oracle Instant Client 的安装也是如此;如果您的机器正在运行它,它也需要是 64 位的。

  2. 如果你想让exe真正独立于软件,你将不得不打包oracle即时客户端并设置系统路径变量。

  3. 我使用过的最简单的运行方式是 py_installer,它开箱即用,运行良好,但我仍在努力包含即时客户端安装程序。

  4. 在导入 cx_oracle 之前设置这些系统路径

    # instantClientPath is the path to the instant client folder
    os.environ["PATH"] = instantClientPath+";"+os.environ["PATH"] 
    os.environ["ORACLE_HOME"] = instantClientPath 
    os.environ["LD_LIBRARY_PATH"] = instantClientPath 
    os.environ["TNS_ADMIN"] = instantClientPath 
    os.environ["NLS_LANG"] = "american_america.WE8MSWIN1252"
    

【讨论】:

    猜你喜欢
    • 2012-02-02
    • 2020-03-31
    • 2021-07-25
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 2021-05-21
    相关资源
    最近更新 更多