【💊 Python的解憂錦囊】 setuptools.errors.PackageDiscoveryError: ..

2023/09/03閱讀時間約 3 分鐘
圖片來源

圖片來源

這個章節雖然發生問題, 但也很好的為我們如何解決問題的能力而訓練, 我們也會搭配AI來幫我們找問題, 當然也會一五一十的告訴您該如何問對問題, 關於問對問題很重要可以參考「【Prompt Engineering 提示工程】Ep.1 什麼是Prompt Engineering?」, 我們相信過程會對大家有幫助, 請耐心閱讀…, 我們會告訴您AI說正確但事實上並非正確的情境。

我們在「【🔒 Python 先修班】教你親手打包專屬套件庫的手作課」有介紹到python的套件包是如何製作的, 但製作過程中卻遇到這種狀況…

pip install .
setuptools.errors.PackageDiscoveryError: Multiple top-level
圖片來源

圖片來源


這究竟是怎麼回事呢? 我們先來問一下AI ChatGPT大神看看可以得到什麼樣的解答。

圖片來源

圖片來源

嗯…, 我們回頭來檢查一下目錄結構, 發現到的確如說明一樣的擺放, 但究竟為啥不能安裝呢?

P.S 我們是採用「flat-layout」的布局方式如下:

|- project
|- docker
|- dev
|- Dockerfile
|- package
|- __init__.py
|- test
|- __init__.py
|- test_core.py

關於無法正常安裝, 我們只好繼續翻翻官方文件囉, 有一個章節在說明安裝包的自動發現功能「Package Discovery and Namespace Packages」, 裡面被我們翻到一個章節「FlatLayoutPackageFinder.DEFAULT_EXCLUDE」,它會自動忽略常見的排除項目, 包括測試、文件…, 其中我們的「test」也涵蓋在其中, docker裡面也沒有包含__init__.py呀! 但卻沒有被忽略的感覺。

我們只好將我們的目錄結構再告訴🤖 AI請它幫我們檢查一下…

圖片來源

圖片來源


結果連AI都說沒錯, 但事實上就是無法安裝, 您說AI究竟是否完全靠譜呢?

此時我們只好發揮 🕵️偵探的精神…,正好我們在官方文件向下翻一翻發現了一些端倪。

raw-image

圖片來源…

文件中有提到implicit這個關鍵字, 主要是設定之後會隱式的去找目錄底下具有「init.py」的packages, 這正好符合我們的「flat-layout」布局。

解決方式

以配置來排除頂層包

我們在安裝包的配置來修改一下自動發現的策略。

# pyproject.toml
[tool.setuptools.packages]
find = {} # Scanning implicit namespaces is active by default

採用src-layout的配置結構

官方有兩種布局模式, 其中一種是src-layout的布局方式, 它的好處是將整個包都放在src底下, 此時就不會有多個頂層包的衝突現象。

project_root_directory
├── pyproject.toml # AND/OR setup.cfg, setup.py
├── ...
└── src/
└── mypkg/
├── __init__.py

結語

原來打包作為最後一道程序竟然這麼多小細節,我們好不容易辛辛苦苦開發出來的套件不能在最後一刻放棄,因此面對問題我們必須不斷的鑽研下去,不過這個篇章的解題方式有點不同,加入了AI元素,讓我們借力使力,站在巨人的肩膀上,提升我們的問題解決能力,如果您想變得更厲害,那麼這裡會是您最好的選擇「🔒 阿Han的軟體心法實戰營」歡迎一起進來聊聊,讓自己成為頂尖的TOP人才吧。

喜歡撰寫文章的你,不妨來了解一下:

Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 - 為什麼要加入?

歡迎加入一起練習寫作,賺取知識,累積財富!

91會員
260內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
發表第一個留言支持創作者!