簡體   English   中英

Python ImportError 在 Python 3.6、3.7、3.8 上,但不在 3.9 上

[英]Python ImportError on Python 3.6, 3.7, 3.8, but not on 3.9

我在我的 CI 上遇到了一個奇怪的導入錯誤,我無法在本地重現,並且不知道如何解決。 我為我的 CI 使用 Azure 管道並運行構建矩陣來為我的 package 構建輪子。 一切都按預期構建。 今天,我想發布一個新版本,我稍微更改了代碼。 我的文件結構是

openTSNE/
   __init__.py
   utils.py
tests/
   test_tsne.py
setup.py

所以源代碼在openTSNE中,測試在tests文件夾中。 我嘗試從 openTSNE.utils 導入is_package_installed中的test_tsne.py openTSNE.utils像這樣

from openTSNE.utils import is_package_installed

我在 Mac、Windows 和 Linux 上為所有版本的 Python 3.6 - 3.9 構建輪子。 我還在 Linux 上構建了一個 sdist。 我首先在每個 CI VM 上構建包,安裝它,然后在安裝的 package 上運行我的單元測試套件。

這就是設置。 這是絕對奇怪的部分:一切都在我的輪子 OSX-py39、Win-py39 和所有 linux 輪子上工作。 不適用於 Linux sdist 版本、OSX-py36 到 py38 或 Win-py36 到 py38。 See the CI build log https://dev.azure.com/pavlingp/openTSNE/_build/results?buildId=359&view=logs&j=9adead4c-7271-5cd3-b143-2c28e08460f5&t=9572adb2-9d5f-5130-5c60-5fd15aeb658c

測試失敗

tests/test_tsne.py:19: in <module>
from openTSNE.utils import is_package_installed
ImportError: cannot import name 'is_package_installed'

源代碼可以在 GH 上找到。 function違規測試 我試圖在我的本地 MacBook 上重現這個但沒有成功。

我不知道可能出了什么問題。 這也是第一次發生這種情況,我已經在這個項目上工作了一段時間,沒有任何此類問題。 任何指向正確方向的幫助或指針,甚至我如何調試/重現它都會受到極大的贊賞。

我已經追蹤到了這個問題。 當我運行 CI 構建時,我並沒有修改版本。 PyPI 上的實時版本是 0.4.4,我正在努力發布 v0.5.0。 但是,我沒有在 package 中更改版本,所以當我構建輪子和 sdist package 時,它們被標記為 0.4.4。

現在,我試圖通過使用--find-links開關運行 pip 來解決這個問題

pip install --user --force-reinstall --find-links dist openTSNE

但是,我不知道 pip 將始終優先考慮 PyPI 上的包而不是本地二進制文件或 sdist。 所以,在我的 CI 服務器上,我正在構建輪子,但是當我實際安裝它們來運行單元測試時,pip 從 PyPI 中拉低了 0.4.4,而不是使用新構建的 package。 這就是發生導入錯誤的原因——我在這個版本中只添加了有問題的is_package_installed function,它在 0.4.4 中不存在。

更新版本解決了這個問題,因為 pip 在 PyPI 上無法找到 0.5.0 並被迫使用本地二進制文件。

對我來說奇怪的是,它在所有平台上的行為方式都不相同,但我們到了。

您是否創建了一個init .py 文件?

openTSNE/
utils.py/
__init__.py
tests/
test_tsne.py
setup.py

如果刪除init .py 文件,Python 將不再在該目錄中查找子模塊,因此嘗試導入模塊將失敗。

init .py 文件通常為空,但可用於以更方便的名稱導出 package 的選定部分,保存方便的功能等。

暫無
暫無

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

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