Windows上的IPython无法导入Geopandas

如何解决Windows上的IPython无法导入Geopandas

我得到一个

ImportError:DLL加载失败:无法指定的过程 找到。

尝试在python 3.6中导入geopandas时出现

错误。具体来说,使用ipython时出现错误,但使用python时却没有。此外,这会影响Windows(Windows Server 2016虚拟机)而不影响Linux。我已经找到了一些有关此问题或非常相似的问题的文章,但我拒绝它们的适用性,因为它们要么不能明确解决问题,要么将其与pip安装混淆。

例如,将近两年前的

This pos t报告了类似的错误,但得出的结论是“没关系,我安装了一些点子的geopandas”。

几年前,

This post的答案已经被接受,尽管原始张贴者评论说这对他们不起作用!我曾经提到Geoff Boeing提到的blog post提供了一种可行的方法,尽管该博客文章提供了多种方法(使用conda安装和更手动的步骤顺序),但注释中没有弄清什么对他们有用。

有将近两年半的this post,它混淆了conda和pip的安装方法,并且没有公认的答案。评论中有一个建议,对于评论者来说,这是conda-forge上的gdal问题。有一个答案再次提到了Geoff Boeing的博客文章。这可能意味着通过conda安装gdal可能会出现问题,如果确实如此,则需要手动执行步骤。我不相信这是我的问题。

我的问题专门在Windows Server 2016虚拟机上以及仅指定conda-forge通道时发生。另外,有针对性的是,它仅在ipython中(因此在Jupyter笔记本中)发生,而不在python中发生,因此:

创建指定conda认频道,指定python 3.6,ipython和geopandas的环境:

conda create -n test36_defaults -c defaults python=3.6 ipython geopandas

激活该环境:

(test36_2) C:\Users\guy.maskall>conda activate test36_defaults

启动一个ipython内核并导入geopandas:

(test36_defaults) C:\Users\guy.maskall>ipython
Python 3.6.12 |Anaconda,Inc.| (default,Sep  9 2020,00:29:25) [MSC v.1916 64 bit (AMD64)]
Type "copyright","credits" or "license" for more information.

IPython 5.8.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object',use 'object??' for extra details.

In [1]: import geopandas as gpd

In [2]:
Do you really want to exit ([y]/n)?

它可以导入。

类似地,启动直接的python解释器:

(test36_defaults) C:\Users\guy.maskall>python
Python 3.6.12 |Anaconda,00:29:25) [MSC v.1916 64 bit (AMD64)] on win32
Type "help","copyright","credits" or "license" for more information.
>>> import geopandas as gpd
>>>

那也可以。

现在创建另一个仅指定conda-forge的环境:

conda create -n test36_cforge -c conda-forge python=3.6 ipython geopandas

激活环境并再次加载ipython以导入geopandas:

(test36_cforge) C:\Users\guy.maskall>ipython
Python 3.6.11 (default,Aug  5 2020,19:41:03) [MSC v.1916 64 bit (AMD64)]
Type "copyright",use 'object??' for extra details.

In [1]: import geopandas as gpd
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-a62d01c1d62e> in <module>()
----> 1 import geopandas as gpd

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\geopandas\__init__.py in <module>()
      5 from geopandas.array import points_from_xy  # noqa
      6
----> 7 from geopandas.io.file import _read_file as read_file  # noqa
      8 from geopandas.io.arrow import _read_parquet as read_parquet  # noqa
      9 from geopandas.io.arrow import _read_feather as read_feather  # noqa

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\geopandas\io\file.py in <module>()
      5 import pandas as pd
      6
----> 7 import fiona
      8 import pyproj
      9 from shapely.geometry import mapping

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\__init__.py in <module>()
     84 import fiona._loading
     85 with fiona._loading.add_gdal_dll_directories():
---> 86     from fiona.collection import BytesCollection,Collection
     87     from fiona.drvsupport import supported_drivers
     88     from fiona.env import ensure_env_with_credentials,Env

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\collection.py in <module>()
      9 with fiona._loading.add_gdal_dll_directories():
     10     from fiona import compat,vfs
---> 11     from fiona.ogrext import Iterator,ItemsIterator,KeysIterator
     12     from fiona.ogrext import Session,WritingSession
     13     from fiona.ogrext import buffer_to_virtual_file,remove_virtual_file,GEOMETRY_TYPES

ImportError: DLL load Failed: The specified procedure Could not be found.

In [2]:
Do you really want to exit ([y]/n)?

所以在ipython中失败了。现在,仅使用简单的python进行尝试:

(test36_cforge) C:\Users\guy.maskall>python
Python 3.6.11 (default,19:41:03) [MSC v.1916 64 bit (AMD64)] on win32
Type "help","credits" or "license" for more information.
>>> import geopandas as gpd
>>>

可行。

above SO posts中的答案之一突出显示了GDAL,Fiona,pyproj,rtree和shapely。 比较上面两个环境之间的conda list输出,我得到了它们完全相同的版本。除了rtree以外,其他所有版本都具有相同的构建。所以我有

gdal                      3.1.4            py36h214b664_0    conda-forge  
fiona                     1.8.17           py36hdef4c2b_1 conda-forge  
pyproj                    2.6.1.post1      py36hfcef96e_3 conda-forge  
shapely                   1.7.1            py36h6dc46f0_1 conda-forge

rtree                     0.9.4            py36h9a6d676_1    conda-forge

(与无效的环境相关联)vs

rtree                     0.9.4            py36h21ff451_1

(在有效的环境中)。

让我很困惑的是,尽管有些帖子牵涉到gdal,并且我的错误输出高于牵涉到fiona加载gdal(我认为),但两种环境似乎都具有完全相同的gdal和fiona版本和构建,并且仅会发生错误在ipython内核中而不是在python中。

能够轻松复制环境对我来说很重要,因此首选conda。除了简单地加载Geopandas,我还有其他要求。例如,我使用datacube,建议使用python 3.6。我以前运行的是更高版本的python,我想启动并运行python 3.6环境,以便查看是否可以解决我遇到的另一个问题。我想缩小导致此错误的原因,因为我希望能够轻松地编辑conda env yaml以尝试不同的环境,并且我可能需要指定多个渠道,因为一个可疑对象(针对另一个问题)是提示工具包,似乎只能在esrf-bcu频道的低于3的版本中使用,但这是另一回事了。

任何人都可以帮助指向

  • 确切地说,可能导致此问题的软件包/版本/版本是什么?
  • 为什么即使在有问题的环境中,它也只会影响ipython?

python版本之间存在微小差异(3.6.11失败,而3.6.12成功),这是我可以探索的东西,但这仍然使我想起为什么ipython与python之间存在差异的问题。

在其他新闻中,我讨厌Windows。

导入fiona和DLL路径

更新2020/11/02 由于错误似乎集中在fiona上,因此我将其归结为这一点。 在anaconda提示符外壳中,我运行了set PYTHONVERBOSE=1,然后加载了ipython并尝试导入fiona:

In [1]: import fiona
# C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\__pycache__\__init__.cpython-36.pyc matches C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\__init__.py
# code object from 'C:\\Users\\guy.maskall\\anaconda3\\envs\\test36_cforge\\lib\\site-packages\\fiona\\__pycache__\\__init__.cpython-36.pyc'
# C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\__pycache__\_loading.cpython-36.pyc matches C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\_loading.py
# code object from 'C:\\Users\\guy.maskall\\anaconda3\\envs\\test36_cforge\\lib\\site-packages\\fiona\\__pycache__\\_loading.cpython-36.pyc'
import 'fiona._loading' # <_frozen_importlib_external.sourceFileLoader object at 0x0000020344DC0C88>
# C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\__pycache__\socket.cpython-36.pyc matches C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\socket.py
# code object from 'C:\\Users\\guy.maskall\\anaconda3\\envs\\test36_cforge\\lib\\__pycache__\\socket.cpython-36.pyc'
# extension module '_socket' loaded from 'C:\\Users\\guy.maskall\\anaconda3\\envs\\test36_cforge\\DLLs\\_socket.pyd'
# extension module '_socket' executed from 'C:\\Users\\guy.maskall\\anaconda3\\envs\\test36_cforge\\DLLs\\_socket.pyd'
import '_socket' # <_frozen_importlib_external.ExtensionFileLoader object at 0x0000020344DCED30>
# C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\__pycache__\selectors.cpython-36.pyc matches C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\selectors.py
# code object from 'C:\\Users\\guy.maskall\\anaconda3\\envs\\test36_cforge\\lib\\__pycache__\\selectors.cpython-36.pyc'
import 'selectors' # <_frozen_importlib_external.sourceFileLoader object at 0x0000020344DD9358>
import 'socket' # <_frozen_importlib_external.sourceFileLoader object at 0x0000020344DCE198>
# C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\__pycache__\collection.cpython-36.pyc matches C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\collection.py
# code object from 'C:\\Users\\guy.maskall\\anaconda3\\envs\\test36_cforge\\lib\\site-packages\\fiona\\__pycache__\\collection.cpython-36.pyc'
# C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\__pycache__\compat.cpython-36.pyc matches C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\compat.py
# code object from 'C:\\Users\\guy.maskall\\anaconda3\\envs\\test36_cforge\\lib\\site-packages\\fiona\\__pycache__\\compat.cpython-36.pyc'
import 'fiona.compat' # <_frozen_importlib_external.sourceFileLoader object at 0x0000020344DE76D8>
# C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\__pycache__\vfs.cpython-36.pyc matches C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\vfs.py
# code object from 'C:\\Users\\guy.maskall\\anaconda3\\envs\\test36_cforge\\lib\\site-packages\\fiona\\__pycache__\\vfs.cpython-36.pyc'
import 'fiona.vfs' # <_frozen_importlib_external.sourceFileLoader object at 0x0000020344DE7780>
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-4c762272c079> in <module>()
----> 1 import fiona

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\importlib\_bootstrap.py in _find_and_load(name,import_)

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\importlib\_bootstrap.py in _find_and_load_unlocked(name,import_)

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\importlib\_bootstrap.py in _load_unlocked(spec)

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\importlib\_bootstrap_external.py in exec_module(self,module)

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\importlib\_bootstrap.py in _call_with_frames_removed(f,*args,**kwds)

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\__init__.py in <module>()
     84 import fiona._loading
     85 with fiona._loading.add_gdal_dll_directories():
---> 86     from fiona.collection import BytesCollection,Env

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\importlib\_bootstrap.py in _find_and_load(name,**kwds)

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\collection.py in <module>()
      9 with fiona._loading.add_gdal_dll_directories():
     10     from fiona import compat,GEOMETRY_TYPES

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\importlib\_bootstrap.py in _find_and_load(name,import_)

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\importlib\_bootstrap.py in _load_unlocked(spec)

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\importlib\_bootstrap.py in module_from_spec(spec)

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\importlib\_bootstrap_external.py in create_module(self,spec)

C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\importlib\_bootstrap.py in _call_with_frames_removed(f,**kwds)

ImportError: DLL load Failed: The specified procedure Could not be found.

但是然后退出ipython并启动直接的python并尝试导入fiona时,我得到了更多的输出(保存所有内容,但着重于ipython似乎可以纾困的部分):

...

import 'fiona.compat' # <_frozen_importlib_external.sourceFileLoader object at 0x00000289AC978470>
# C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\__pycache__\vfs.cpython-36.pyc matches C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\vfs.py
# code object from 'C:\\Users\\guy.maskall\\anaconda3\\envs\\test36_cforge\\lib\\site-packages\\fiona\\__pycache__\\vfs.cpython-36.pyc'
import 'fiona.vfs' # <_frozen_importlib_external.sourceFileLoader object at 0x00000289AC997550>
# extension module 'fiona.ogrext' loaded from 'C:\\Users\\guy.maskall\\anaconda3\\envs\\test36_cforge\\lib\\site-packages\\fiona\\ogrext.cp36-win_amd64.pyd'
# extension module 'fiona._geometry' loaded from 'C:\\Users\\guy.maskall\\anaconda3\\envs\\test36_cforge\\lib\\site-packages\\fiona\\_geometry.cp36-win_amd64.pyd'
# extension module 'fiona._err' loaded from 'C:\\Users\\guy.maskall\\anaconda3\\envs\\test36_cforge\\lib\\site-packages\\fiona\\_err.cp36-win_amd64.pyd'
# extension module 'fiona._err' executed from 'C:\\Users\\guy.maskall\\anaconda3\\envs\\test36_cforge\\lib\\site-packages\\fiona\\_err.cp36-win_amd64.pyd'
import 'fiona._err' # <_frozen_importlib_external.ExtensionFileLoader object at 0x00000289AC9EE7F0>
# C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\__pycache__\errors.cpython-36.pyc matches C:\Users\guy.maskall\anaconda3\envs\test36_cforge\lib\site-packages\fiona\errors.py
# code object from 'C:\\Users\\guy.maskall\\anaconda3\\envs\\test36_cforge\\lib\\site-packages\\fiona\\__pycache__\\errors.cpython-36.pyc'
import 'fiona.errors' # <_frozen_importlib_external.sourceFileLoader object at 0x00000289AC9EEFD0>

...

这是我真的不熟悉的勇气!但似乎我可以放心地说几件事:

  • ipython和python都从同一路径导入(如您所愿)
  • 在ipython崩溃之后,python报告/有关正在加载扩展模块fiona.ogrext的注释,这是回溯中报告的最后一个错误
  • 此外,该错误在fiona._loading.add_gdal_dll_directories()的上下文内,表明与DLL路径有关

但是我还是要问为什么此功能或查找DLL在ipython中的行为与python不同?

此外,我已经验证我在Windows 10 Pro 2004版上也看到了相同的行为。

解决方法

只需从3.6.11中指定python 3.6.12就可以解决特定的导入问题,因此:

conda create -n test36_12_cforge -c conda-forge python=3.6.12 ipython geopandas
(test36_12_cforge) C:\Users\guy.maskall>ipython
Python 3.6.12 |Anaconda,Inc.| (default,Sep  9 2020,00:29:25) [MSC v.1916 64 bit (AMD64)]
Type "copyright","credits" or "license" for more information.

IPython 5.8.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object',use 'object??' for extra details.

In [1]: import geopandas as gpd

In [2]:
Do you really want to exit ([y]/n)?

(test36_12_cforge) C:\Users\guy.maskall>ipython
Python 3.6.12 |Anaconda,use 'object??' for extra details.

In [1]: import fiona

In [2]:
Do you really want to exit ([y]/n)?

我不愿意接受自己的回答。对于我们碰面的啤酒,有谁能解释为什么行为会有所不同,具体取决于导入是通过ipython还是python完成的?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?