簡體   English   中英

Windows 上的 IPython 無法導入 geopandas

[英]IPython on Windows fails to import geopandas

我得到一個

導入錯誤:DLL 加載失敗:找不到指定的過程。

嘗試在 python 3.6 中導入 geopandas 時出錯。 具體來說,我在使用 ipython 時出現錯誤,但在使用 python 時卻沒有。 此外,這會影響 Windows(Windows Server 2016 虛擬機)而不是 Linux。 我已經找到了一些以前的帖子,或者非常相似的問題,但我拒絕它們的適用性,因為它們要么沒有明確解決問題,要么將其與 pip 安裝混為一談。

這正從兩年前T,例如,報告了類似的錯誤,但有總結說:“沒關系,我做了一個點子安裝geopandas的”。

盡管最初的海報評論說它對他們不起作用,但幾年前的這篇帖子得到了公認的答案! 提到了 GeoffBoeing 的一篇博客文章,我之前看到它提供了一種工作方法,盡管該博客文章提供了不止一種方法(conda 安裝和更手動的步驟序列)並且評論沒有說明什么有效為他們。

近兩年半前的這篇文章將 conda 和 pip 安裝方法混為一談,但沒有公認的答案。 評論中有一個建議,對於評論者來說,這是 conda-forge 上 gdal 的問題。 有一個答案再次引用了 GeoffBoeing 的博文。 這意味着通過 conda 安裝 gdal 可能會出現問題,如果是,則需要手動執行步驟序列。 我不相信這是我的問題。

我的問題特別出現在 Windows Server 2016 虛擬機上,並且僅在指定 conda-forge 通道時出現。 此外,相關地,它只出現在 ipython(以及 Jupyter notebooks)中,而不出現在 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, Inc.| (default, Sep  9 2020, 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", "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
---------------------------------------------------------------------------
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, Aug  5 2020, 19:41:03) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import geopandas as gpd
>>>

那個有效。

上述 SO 帖子中的答案之一重點介紹了 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 以嘗試不同的環境,並且我可能需要指定多個通道作為一個嫌疑人(針對另一個問題)是 prompt-toolkit ,它似乎只在 esrf-bcu 頻道低於 3 的版本中可用,但那是另一回事了。

所以誰能幫忙指點一下

  • 究竟是什么包/版本/構建可能導致這種情況?
  • 究竟為什么,即使在問題環境中,它也只影響 ipython?

python 版本有一個小的差異(3.6.11 失敗,3.6.12 成功),這是我可以探索的東西,但這仍然讓我的問題是為什么 ipython 與 python 之間存在差異。

在其他新聞中,我討厭 Windows。

導入 fiona 和 DLL 路徑

2020 年 11 月 2 日更新 由於錯誤似乎集中在 fiona 上,我將其歸結為僅此而已。 在 anaconda 提示符 shell 中,我運行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, 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\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\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

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.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, *args, **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 Version 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, 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 fiona

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

我不願意接受我自己的答案。 對於啤酒,如果我們見面,誰能解釋為什么根據導入是從 ipython 還是從 python 完成的行為會存在這種差異?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM