Python應用程序的最佳項目結構是什麼? [關閉]

想象一下,您想用Python開發一個平凡的最終用戶桌面(非Web)應用程序。 構造項目文件夾層次結構的最佳方法是什麼? python

理想的功能是易於維護,IDE友好,適用於源代碼控制分支/合併以及易於生成安裝軟件包。 api

尤爲是: app

  1. 您將源放在哪裏?
  2. 您將應用程序啓動腳本放在哪裏?
  3. 您將IDE項目放在哪裏?
  4. 您將單元/驗收測試放在哪裏?
  5. 您將非Python數據(例如配置文件)放在哪裏?
  6. 您將pyd / so二進制擴展模塊的非Python源代碼(例如C ++)放在哪裏?

#1樓

沒什麼大不了的。 令您快樂的一切都會起做用。 沒有不少愚蠢的規則,由於Python項目能夠很簡單。 工具

  • /scripts/bin用於那種命令行界面
  • /tests進行測試
  • /lib用於您的C語言庫
  • /doc獲取大多數文檔
  • /apidoc用於Epydoc生成的API文檔。

頂級目錄能夠包含自述文件,配置文件和其餘內容。 佈局

艱難的選擇是是否使用/src樹。 像Java或C同樣,Python在/src/lib/bin之間沒有區別。 測試

因爲某些人認爲頂級/src目錄沒有意義,所以頂級目錄能夠是應用程序的頂級體系結構。 ui

  • /foo
  • /bar
  • /baz

我建議將全部這些都放在「個人產品名稱」目錄下。 所以,若是您正在編寫一個名爲quux的應用程序,則包含全部這些內容的目錄將命名爲/quuxspa

而後,另外一個項目的PYTHONPATH能夠包含/path/to/quux/foo以重用QUUX.foo模塊。 命令行

就我而言,因爲我使用Komodo Edit,因此個人IDE cuft是單個.KPF文件。 我實際上將其放在頂級/quux目錄中,並省略了將其添加到SVN中的狀況。 code


#2樓

最好使用setuptools中package_data支持將非Python數據捆綁在Python模塊中。 我強烈建議您使用名稱空間包來建立多個項目可使用的共享名稱空間,這很像Java約定,即將軟件包放在com.yourcompany.yourproject (並可以擁有共享的com.yourcompany.utils名稱空間)。

從新分支和合並,若是使用足夠好的源代碼控制系統,即便經過重命名也能夠處理合並; 集市在這方面尤爲擅長。

與這裏的其餘答案相反,我對src頂級目錄(帶有doctest目錄)+1。 文檔目錄樹的特定約定將根據您所使用的內容而有所不一樣。 例如, Sphinx有其快速啓動工具支持的本身的約定。

請,請利用setuptools和pkg_resources; 這使得其餘項目更容易依賴於代碼的特定版本(若是使用package_data ,則能夠同時將多個版本與不一樣的非代碼文件一塊兒安裝)。


#3樓

以個人經驗,這只是迭代問題。 將您的數據和代碼放在您認爲任何地方。 頗有可能,不管如何你都會錯的。 可是,一旦您對事物的確切形狀有了一個更好的瞭解,您就能夠進行這些猜想。

至於擴展源,咱們在主幹下有一個Code目錄,其中包含python目錄和各類其餘語言的目錄。 就我的而言,下一次我更傾向於嘗試將任何擴展代碼放入其本身的存儲庫中。

話雖如此,我回到個人初衷:不要作太大的事情。 將其放在彷佛對您有用的地方。 若是您發現不起做用的地方,則能夠(而且應該)對其進行更改。


#4樓

以正確的方式查看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目錄。


#5樓

嘗試使用python_boilerplate模板啓動項目。 它在很大程度上遵循了最佳實踐(例如此處的 ),可是若是您發現本身願意在某個時候將您的項目分紅多個雞蛋(而且相信我,除了最簡單的項目以外的其餘任何東西),它會更適合。常見的狀況是您必須使用其餘人庫的本地修​​改版本)。

  • 您將源放在哪裏?

    • 對於大型項目,將源分紅幾個雞蛋是有意義的。 每一個雞蛋將做爲PROJECT_ROOT/src/<egg_name>下的單獨setuptools-layout PROJECT_ROOT/src/<egg_name>
  • 您將應用程序啓動腳本放在哪裏?

    • 理想的選擇是將應用程序啓動腳本註冊爲其中一個雞蛋中的entry_point
  • 您將IDE項目放在哪裏?

    • 取決於IDE。 他們中的許多人將他們的東西保存在項目根目錄的PROJECT_ROOT/.<something>中,這很好。
  • 您將單元/驗收測試放在哪裏?

    • 每一個雞蛋都有一組單獨的測試,保存在其PROJECT_ROOT/src/<egg_name>/tests目錄中。 我我的更喜歡使用py.test來運行它們。
  • 您將非Python數據(例如配置文件)放在哪裏?

    • 這取決於。 可能有不一樣類型的非Python數據。
      • 「資源」 ,即必須包裝在一個雞蛋中的數據。 該數據進入包名稱空間中某個位置的相應egg目錄。 它能夠經過使用pkg_resources包從setuptools經過,或由於Python 3.7 importlib.resources從標準庫模塊。
      • 「配置文件」 ,即非Python文件,它們被視爲項目源文件的外部文件,但在應用程序開始運行時必須使用一些值進行初始化。 在開發期間,我更喜歡將此類文件保留在PROJECT_ROOT/config 。 對於部署,能夠有多種選擇。 在Windows上,可使用%APP_DATA%/<app-name>/config ,在Linux上,可使用/etc/<app-name>/opt/<app-name>/config
      • 生成的文件 ,即應用程序在執行期間能夠建立或修改的文件。 我寧願讓他們在PROJECT_ROOT/var的發展過程當中,以及在/var Linux部署中。
  • 您將pyd / so二進制擴展模塊的非Python源代碼(例如C ++)放在哪裏?
    • 進入PROJECT_ROOT/src/<egg_name>/native

文檔一般會放在PROJECT_ROOT/docPROJECT_ROOT/src/<egg_name>/doc (這取決於您是否將某些雞蛋視爲一個單獨的大型項目)。 一些其餘配置將在文件PROJECT_ROOT/buildout.cfgPROJECT_ROOT/setup.cfg

相關文章
相關標籤/搜索