仅使用IPython时导入错误

2024-04-27 00:05:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

到目前为止的调试步骤:

  • 你知道吗系统可执行文件在这两种情况下是相同的(venv Python和venv IPython)
  • 你知道吗操作系统环境[“路径”]相同
  • 你知道吗系统路径在ipython中,在ipython的末尾有几个额外的路径-C:\Users\user\.ipython和'c:\virtualenvs\mapscript-jupyter3\lib\site packages\ipython\extensions',但在其他方面是相同的。删除这些路径不会更改错误。你知道吗
  • 我试着用进程监视器找到一个丢失的DLL,但它们似乎都找到了。你知道吗

对于新创建的venvs,在python2.7和python3.6中都会出现同样的问题。 这个问题似乎与ipython notebook can import a pyd module but the python interpter can't相反

所以我的问题是IPython对Python环境做了什么,这会导致与标准Python的差异,并导致错误?你知道吗


Tags: import路径标准环境venv系统错误ipython
1条回答
网友
1楼 · 发布于 2024-04-27 00:05:19

这花了很长时间才找到问题所在。使用Process Monitor很容易发现任何丢失的dll。但是在本例中,找到了所有依赖的dll,但其中一个没有我尝试导入的.pyd文件(或关联的dll)使用的函数。你知道吗

我设法将测试范围缩小到导致错误的两个命令—直接加载PYD。你知道吗

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

我尝试在虚拟环境内外删除/修改路径,py2和py3都产生了相同的错误。你知道吗

然后我试着运行Process Monitor并比较结果——除了ipython为交互式shell加载了许多额外的Python库之外,没有什么特别之处。你知道吗

processmonitor为每个事件提供了一个方便的属性选项,它还显示了为流程加载的模块。这些可以排序,然后复制到剪贴板。你知道吗

Loaded Modules

我能够比较工作的Python进程和中断的IPython进程的输出。IPython包含了根Python安装(C:\Python36\DLLs)中的几个额外的.pyd文件。我知道我要加载的pyd是使用过的sqlite,这是加载的模块之一(大概是IPython将所有输入命令存储在sqlite数据库中,以便轻松访问历史记录)。临时删除\u sqlite3.pyd文件允许加载模块。你知道吗

Python DLLs文件夹优先于路径上的文件夹,因此当前的修复方法是将Python dll文件夹中的sqlite3.dll替换为MapServer使用的文件夹,并且所有这些文件夹都正常工作。你知道吗

相关问题 更多 >