[英]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.