【问题标题】:ImportError when using IPython only仅使用 IPython 时出现 ImportError
【发布时间】:2018-10-29 10:00:08
【问题描述】:

我有一个已编译的 .pyd 模块,它依赖于其他几个 DLL(Python mapscript 和 MapServer),我正在尝试在 Windows 10 上的 IPython 中使用它。设置步骤如下:

  • 创建了一个新的虚拟环境
  • 已将 mapscript 安装到环境中
  • 设置 PATH 以包含包含 MapServer DLL 的文件夹
  • “import mapscript”在使用标准 venv Python 运行时可以正常工作
  • 启动 ipython 并运行“import mapscript”时出现以下错误:ImportError: DLL load failed: The specified procedure could not be found.

到目前为止的调试步骤:

  • sys.executable 在两种情况下都是相同的(venv Python 和 venv IPython)
  • os.environ["PATH"] 相同
  • ipython 中的 sys.path 最后在 IPython 中有几个额外的路径 - C:\Users\user\.ipython 和 'c:\virtualenvs\mapscript-jupyter3\lib\site-packages\IPython\extensions' 但在其他方面是相同的。删除这些路径不会改变错误。
  • 我尝试使用进程监视器查找丢失的 DLL,但似乎都找到了。

在带有新创建的 venv 的 Python 2.7 和 Python 3.6 中都会出现同样的问题。 这个问题似乎与ipython notebook can import a pyd module but the python interpter can't相反

所以我的问题是,IPython 对 Python 环境做了什么会导致与标准 Python 的差异并导致 ImportError?

【问题讨论】:

    标签: python ipython importerror


    【解决方案1】:

    这花了很长时间才找到问题。使用Process Monitor 很容易发现任何丢失的DLL。然而,在这种情况下,找到了所有相关的 DLL,但其中一个没有我试图导入的 .pyd 文件(或关联的 DLL)使用的函数。

    我设法将测试范围缩小到导致错误的 2 个命令 - 直接加载 PYD。

    python -c "import _mapscript"
    ipython -c "import _mapscript"
    

    我尝试删除/修改 PATH、进出虚拟环境以及 py2 和 py3,但都产生了相同的错误。

    然后我尝试运行 Process Monitor 并比较结果 - 除了 ipython 为交互式 shell 加载大量额外的 Python 库之外,没有什么特别突出的。

    Process Monitor 为每个事件包含一个方便的属性选项,它还显示为进程加载了哪些模块。这些可以排序,然后复制到剪贴板。

    我能够比较正常工作的 Python 和损坏的 IPython 进程的输出。 IPython 包含几个来自根 Python 安装 (C:\Python36\DLLs) 的附加 .pyd 文件。我知道我试图加载使用过的 sqlite 的 pyd,这是加载的模块之一(大概是因为 IPython 将所有输入命令存储在 sqlite 数据库中以轻松访问历史记录)。暂时删除 _sqlite3.pyd 文件允许加载模块。

    Python DLLs 文件夹优先于 PATH 上的文件夹,因此当前的解决方法是将 Python DLL 文件夹中的 sqlite3.dll 替换为 MapServer 使用的文件夹,并且一切正常。

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 2021-06-07
      • 2016-08-05
      • 1970-01-01
      • 2018-03-09
      • 2017-05-11
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多