[英]What is the right way to manage namespaces in Python 3?
我的大部分編程背景是 C++ 和 Java,但出於專業原因,我開始學習 Python。 我注意到的第一件事是 Python 的包和命名空間的新方法,但在谷歌搜索一段時間並做了一些實驗后,我認為我開始掌握它的竅門。
然后我讀了這個,這表明我剛剛學到的一切都是錯誤的。 所以現在我又困惑了,我無法弄清楚我應該如何組織我的代碼。
這是一個非常具體的問題,我真的不知道如何正確回答任何版本的 Python,特別是我不知道答案是否從 Python 2 更改為 3。假設我想要一個克隆的 github 中的類回購,存儲在:
/Users/me/my_teams_code/some_project/package/IWantThisClass.py
但是假設我在這里還有其他一些項目:
/Users/me/my_own_code/some_other_project1/...
/Users/me/my_own_code/some_other_project2/...
/Users/me/my_own_code/some_other_project3/...
每個都使用 IWantThisClass。 一種策略似乎是每次都手動將正確的目錄添加到 sys.path ,但這相當麻煩 - 特別是當我只是在 Jupyter notebook 中進行試驗時。 我在谷歌搜索后確定的解決方案是在 bash 中將包目錄添加到我的 PYTHONPATH 變量中; 這在“導入 IWantThisClass”的意義上工作得很好。 但我在上面 Coghlan 的帖子中讀到:
“下一個陷阱存在於所有當前版本的 Python 中,包括 3.3,並且可以總結為以下一般准則:'永遠不要將包目錄或包內的任何目錄直接添加到 Python 路徑'。”
那么解決這個問題的“正確”方法是什么?
基本上,如果package
是您的包的頂級目錄,您應該將包含package
的目錄添加到sys.path
。 如果您要導入的不是包而是單個模塊(即,只是不在包目錄中的單個.py
文件),則該模塊應位於sys.path
/ 目錄中
究竟應該如何添加這些路徑是另一個問題。 對於我想向路徑添加一次性內容的情況,我發現最簡單的方法是在“站點目錄”中創建一個.PTH
文件——無論是主站點包目錄還是用戶——特定的站點包目錄。 在該.PTH
文件中,您可以列出其他目錄,然后將這些目錄添加到site.path
。 因此,您可以擁有自己的my_stuff.pth
小文件,該文件使用您需要的目錄設置sys.path
。 這避免了必須向每個腳本添加樣板代碼以手動修改sys.path
。 您可以在site
模塊的文檔中閱讀有關如何執行此操作的信息。
另一個可能更好的答案是,您應該盡量避免將特定目錄添加到sys.path
以訪問特定文件。 相反,您應該嘗試安裝相關的包,這會讓 Python 為您設置路徑。 如果您正在使用不希望弄亂主站點包的python setup.py develop
包,您可以使用python setup.py develop
或pip install --editable
來“就地”安裝包。 (也就是說,包文件將保持.PTH
,不會移動到全局 Python 站點包中,安裝程序將更新相應的.PTH
文件,以便新安裝的包可以導入。)
簡而言之,最終您需要從“這個文件想要這個其他文件中的這個類”的角度來查看它。 您應該關注的單元是可安裝的包或模塊。 如果你正在編寫需要 SomeClass 的代碼,你應該安裝提供 SomeClass 的包/模塊,然后導入它; 不要試圖在不安裝包的情況下臨時操作sys.path
來定位您想要的單個文件/類。 (如前所述, setup.py develop
和pip install --editable
允許您執行此操作,同時仍將實際文件保留在您想要的位置。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.