想象一下,您想用Python開發一個平凡的最終用戶桌面(非Web)應用程序。 構造項目文件夾層次結構的最佳方法是什麼? python
理想的功能是易於維護,IDE友好,適用於源代碼控制分支/合併以及易於生成安裝軟件包。 api
尤爲是: app
沒什麼大不了的。 令您快樂的一切都會起做用。 沒有不少愚蠢的規則,由於Python項目能夠很簡單。 工具
/scripts
或/bin
用於那種命令行界面 /tests
進行測試 /lib
用於您的C語言庫 /doc
獲取大多數文檔 /apidoc
用於Epydoc生成的API文檔。 頂級目錄能夠包含自述文件,配置文件和其餘內容。 佈局
艱難的選擇是是否使用/src
樹。 像Java或C同樣,Python在/src
, /lib
和/bin
之間沒有區別。 測試
因爲某些人認爲頂級/src
目錄沒有意義,所以頂級目錄能夠是應用程序的頂級體系結構。 ui
/foo
/bar
/baz
我建議將全部這些都放在「個人產品名稱」目錄下。 所以,若是您正在編寫一個名爲quux
的應用程序,則包含全部這些內容的目錄將命名爲/quux
。 spa
而後,另外一個項目的PYTHONPATH
能夠包含/path/to/quux/foo
以重用QUUX.foo
模塊。 命令行
就我而言,因爲我使用Komodo Edit,因此個人IDE cuft是單個.KPF文件。 我實際上將其放在頂級/quux
目錄中,並省略了將其添加到SVN中的狀況。 code
最好使用setuptools中的package_data
支持將非Python數據捆綁在Python模塊中。 我強烈建議您使用名稱空間包來建立多個項目可使用的共享名稱空間,這很像Java約定,即將軟件包放在com.yourcompany.yourproject
(並可以擁有共享的com.yourcompany.utils
名稱空間)。
從新分支和合並,若是使用足夠好的源代碼控制系統,即便經過重命名也能夠處理合並; 集市在這方面尤爲擅長。
與這裏的其餘答案相反,我對src
頂級目錄(帶有doc
和test
目錄)+1。 文檔目錄樹的特定約定將根據您所使用的內容而有所不一樣。 例如, Sphinx有其快速啓動工具支持的本身的約定。
請,請利用setuptools和pkg_resources; 這使得其餘項目更容易依賴於代碼的特定版本(若是使用package_data
,則能夠同時將多個版本與不一樣的非代碼文件一塊兒安裝)。
以個人經驗,這只是迭代問題。 將您的數據和代碼放在您認爲任何地方。 頗有可能,不管如何你都會錯的。 可是,一旦您對事物的確切形狀有了一個更好的瞭解,您就能夠進行這些猜想。
至於擴展源,咱們在主幹下有一個Code目錄,其中包含python目錄和各類其餘語言的目錄。 就我的而言,下一次我更傾向於嘗試將任何擴展代碼放入其本身的存儲庫中。
話雖如此,我回到個人初衷:不要作太大的事情。 將其放在彷佛對您有用的地方。 若是您發現不起做用的地方,則能夠(而且應該)對其進行更改。
以正確的方式查看Open Sourcing Python項目 。
讓我摘錄那篇優秀文章的項目佈局部分:
設置項目時,佈局(或目錄結構)對於正確設置很重要。 合理的佈局意味着潛在的貢獻者沒必要花大量的時間尋找代碼。 文件位置很直觀。 因爲咱們正在處理現有項目,所以這意味着您可能須要移動一些內容。
讓咱們從頂部開始。 大多數項目都有許多頂級文件(例如setup.py,README.md,requirements.txt等)。 每一個項目應具備三個目錄:
- 包含項目文檔的docs目錄
- 以項目名稱命名的目錄,用於存儲實際的Python包
- 在兩個位置之一中的測試目錄
- 在包含測試代碼和資源的包目錄下
- 做爲獨立的頂層目錄爲了更好地瞭解文件的組織方式,如下是個人一個項目sandman的佈局簡化快照:
$ pwd ~/code/sandman $ tree . |- LICENSE |- README.md |- TODO.md |- docs | |-- conf.py | |-- generated | |-- index.rst | |-- installation.rst | |-- modules.rst | |-- quickstart.rst | |-- sandman.rst |- requirements.txt |- sandman | |-- __init__.py | |-- exception.py | |-- model.py | |-- sandman.py | |-- test | |-- models.py | |-- test_sandman.py |- setup.py
如您所見,有一些頂級文件,一個docs目錄(生成的是一個空目錄,sphinx將在其中放置生成的文檔),一個sandman目錄和一個sandman下的test目錄。
嘗試使用python_boilerplate模板啓動項目。 它在很大程度上遵循了最佳實踐(例如此處的 ),可是若是您發現本身願意在某個時候將您的項目分紅多個雞蛋(而且相信我,除了最簡單的項目以外的其餘任何東西),它會更適合。常見的狀況是您必須使用其餘人庫的本地修改版本)。
您將源放在哪裏?
PROJECT_ROOT/src/<egg_name>
下的單獨setuptools-layout PROJECT_ROOT/src/<egg_name>
。 您將應用程序啓動腳本放在哪裏?
entry_point
。 您將IDE項目放在哪裏?
PROJECT_ROOT/.<something>
中,這很好。 您將單元/驗收測試放在哪裏?
PROJECT_ROOT/src/<egg_name>/tests
目錄中。 我我的更喜歡使用py.test
來運行它們。 您將非Python數據(例如配置文件)放在哪裏?
pkg_resources
包從setuptools
經過,或由於Python 3.7 importlib.resources
從標準庫模塊。 PROJECT_ROOT/config
。 對於部署,能夠有多種選擇。 在Windows上,可使用%APP_DATA%/<app-name>/config
,在Linux上,可使用/etc/<app-name>
或/opt/<app-name>/config
。 PROJECT_ROOT/var
的發展過程當中,以及在/var
Linux部署中。 PROJECT_ROOT/src/<egg_name>/native
文檔一般會放在PROJECT_ROOT/doc
或PROJECT_ROOT/src/<egg_name>/doc
(這取決於您是否將某些雞蛋視爲一個單獨的大型項目)。 一些其餘配置將在文件PROJECT_ROOT/buildout.cfg
和PROJECT_ROOT/setup.cfg
。