問題Python應用程序的最佳項目結構是什麼? [關閉] - 程式設計 ...

文章推薦指數: 80 %
投票人數:10人

想象一下,您希望用Python開發一個非平凡的最終用戶桌面(而不是Web)應用程序。

構建項目文件夾層次結構的最佳方法是什麼? 理想的功能是易於維護,IDE友好,適用於源 ... adabai.com Togglenavigation 問題討論 問題Python應用程序的最佳項目結構是什麼?[關閉] 想象一下,您希望用Python開發一個非平凡的最終用戶桌面(而不是Web)應用程序。

構建項目文件夾層次結構的最佳方法是什麼? 理想的功能是易於維護,IDE友好,適用於源代碼控制分支/合並,以及易於生成安裝包。

尤其是: 你把源頭放在哪裡? 你把應用程序啟動腳本放在哪裡? 你把IDE項目放在哪裡? 你在哪裡進行單位/驗收測試? 你在哪裡放置非Python數據,如配置文件? 你在哪裡為pyd/so二進制擴展模塊放置非Python源代碼如C++? 7474 2017-10-1021:50 起源 答案: 沒關系太重要瞭。

無論什麼讓你快樂都會奏效。

沒有很多愚蠢的規則,因為Python項目可以很簡單。

/scripts 要麼/bin 對於那種命令行界面的東西 /tests 為瞭你的測試 /lib 為您的C語言庫 /doc 對於大多數文檔 /apidoc 對於Epydoc生成的API文檔。

頂級目錄可以包含README,Config和whatnot。

很難選擇是否使用/src 樹。

Python之間沒有區別/src,/lib,和/bin 像Java或C一樣。

自頂級以來/src 某些目錄被視為毫無意義,您的頂級目錄可以是應用程序的頂級體系結構。

/foo /bar /baz 我建議將所有這些放在“我的產品名稱”目錄下。

所以,如果你正在編寫一個名為的應用程序quux,包含所有這些東西的目錄被命名/quux。

另一個項目PYTHONPATH那麼,可以包括/path/to/quux/foo 重用QUUX.foo 模塊。

在我的情況下,因為我使用KomodoEdit,我的IDEcuft是一個.KPF文件。

我實際上把它放在頂級/quux 目錄,並省略將其添加到SVN。

303 2017-10-1022:03 你建議模擬他們的目錄結構的任何開源python項目?-LanceRushing看看Django就是一個很好的例子。

-S.Lott我不傾向於將Django視為一個很好的例子-使用sys.path的技巧是我書中的即時DQ。

-CharlesDuffy@CharlesDuffy:“使用sys.path的技巧”?你能提供鏈接或報價嗎?-S.Lott重新“欺騙”:Django將根項目文件夾的父級添加到sys.path,以便可以將模塊導入為“fromproject.app.moduleimportklass”或“fromapp.moduleimportklass”。

-JonathanHartley 答案: 沒關系太重要瞭。

無論什麼讓你快樂都會奏效。

沒有很多愚蠢的規則,因為Python項目可以很簡單。

/scripts 要麼/bin 對於那種命令行界面的東西 /tests 為瞭你的測試 /lib 為您的C語言庫 /doc 對於大多數文檔 /apidoc 對於Epydoc生成的API文檔。

頂級目錄可以包含README,Config和whatnot。

很難選擇是否使用/src 樹。

Python之間沒有區別/src,/lib,和/bin 像Java或C一樣。

自頂級以來/src 某些目錄被視為毫無意義,您的頂級目錄可以是應用程序的頂級體系結構。

/foo /bar /baz 我建議將所有這些放在“我的產品名稱”目錄下。

所以,如果你正在編寫一個名為的應用程序quux,包含所有這些東西的目錄被命名/quux。

另一個項目PYTHONPATH那麼,可以包括/path/to/quux/foo 重用QUUX.foo 模塊。

在我的情況下,因為我使用KomodoEdit,我的IDEcuft是一個.KPF文件。

我實際上把它放在頂級/quux 目錄,並省略將其添加到SVN。

303 2017-10-1022:03 你建議模擬他們的目錄結構的任何開源python項目?-LanceRushing看看Django就是一個很好的例子。

-S.Lott我不傾向於將Django視為一個很好的例子-使用sys.path的技巧是我書中的即時DQ。

-CharlesDuffy@CharlesDuffy:“使用sys.path的技巧”?你能提供鏈接或報價嗎?-S.Lott重新“欺騙”:Django將根項目文件夾的父級添加到sys.path,以便可以將模塊導入為“fromproject.app.moduleimportklass”或“fromapp.moduleimportklass”。

-JonathanHartley 根據Jean-PaulCalderone的說法Python項目的文件系統結構: Project/ |--bin/ ||--project | |--project/ ||--test/ |||--__init__.py |||--test_main.py || ||--__init__.py ||--main.py | |--setup.py |--README 197 2018-05-1323:49 Project/project/?啊,第二個是包名。

-CeesTimmermanbin文件夾中的可執行文件如何引用項目模塊?(我不認為python語法允許../ 在包含聲明中)-ThorSummoner@ThorSummoner僅在保留在單個包中時才有效。

要在這裡工作的相對導入,你需要一個__init__.py 兩個文件bin 文件夾和Project 頂級文件夾。

-Yonatan@ThorSummoner簡單。

你安裝包!(pipinstall-e/path/to/Project)-Kroltan如果有人用hello.py和hello-test.py壓縮這個佈局的樣本並使它可用於我們的newbs,那將是非常棒的。

-jeremyjjbrown 這個Jean-PaulCalderone的博客文章 通常在Freenode的#python中給出答案。

Python項目的文件系統結構 做: 將目錄命名為與項目相關的內容。

例如,如果項目名為“Twisted”,則將其源文件命名為頂級目錄Twisted。

執行發佈時,應包含版本號後綴:Twisted-2.5。

創建一個目錄Twisted/bin 並將你的可執行文件放在那裡,如果你有的話。

不要給他們一個.py 擴展,即使它們是Python源文件。

除瞭導入和調用項目中其他地方定義的main函數之外,不要在其中添加任何代碼。

(輕微的皺紋:因為在Windows上,解釋器是通過文件擴展名選擇的,你的Windows用戶實際上確實需要.py擴展名。

所以,當你打包Windows時,你可能想要添加它。

不幸的是,沒有簡單的幹擾技巧我知道要自動化這個過程。

考慮到在POSIX上.py擴展隻是一個疣,而在Windows上缺少是一個實際的錯誤,如果你的用戶群包括Windows用戶,你可能想要選擇隻有.py到處擴展。

) 如果您的項目可以表示為單個Python源文件,那麼將其放入目錄並將其命名為與項目相關的內容。

例如,Twisted/twisted.py。

如果您需要多個源文件,請改為創建包(Twisted/twisted/,空著Twisted/twisted/__init__.py)並將源文件放入其中。

例如,Twisted/twisted/internet.py。

將您的單元測試放在包的子包中(註意-這意味著上面的單個Python源文件選項是一個技巧-你總是 需要至少一個其他文件進行單元測試)。

例如,Twisted/twisted/test/。

當然,把它作為一個包Twisted/twisted/test/__init__.py。

將測試放在像Twisted/twisted/test/test_internet.py。

加Twisted/README 和Twisted/setup.py 如果你感覺很好,分別解釋和安裝你的軟件。

別: 將您的源放在一個名為的目錄中src 要麼lib。

這使得在沒有安裝的情況下很難運行。

把你的測試放在你的Python包之外。

這使得很難針對已安裝的版本運行測試。

創建一個包隻要 有一個__init__.py 然後將所有代碼放入__init__.py。

隻需制作一個模塊而不是一個包,它就更簡單瞭。

嘗試提出神奇的黑客攻擊,使Python能夠導入您的模塊或包,而無需用戶將包含它的目錄添加到其導入路徑(通過PYTHONPATH或其他一些機制)。

你會不 正確處理所有情況,當您的軟件無法在其環境中工作時,用戶會對您生氣。

180 2017-08-0523:29 這正是我所需要的。

“不要嘗試提出神奇的黑客攻擊,以使Python能夠導入您的模塊或包,而無需用戶將包含它的目錄添加到其導入路徑中。

”很高興知道!-JackO'Connor事實上,這並未提及項目的重要文檔部分。

-lpapp對於“將您的源代碼放在名為src或lib的目錄中感到困惑。

這使得在沒有安裝的情況下很難運行。

”會安裝什麼?它是導致問題的目錄名稱,還是它根本就是一個子目錄?-PeterEhrlich“有些人會聲稱你應該在你的模塊中分發測試-我不同意。

它通常會增加用戶的復雜性;許多測試套件通常需要額外的依賴關系和運行時環境。

”python-guide-pt-br.readthedocs.io/en/latest/writing/structure/...-endolith@JackO'Connor我很困惑。

如何導入內部定義的主函數Twisted/twisted 來自可執行文件Twisted/bin 沒有修改路徑?-GoodDeeds 查看以正確的方式開源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下的測試目錄。

95 2017-11-0902:22 我這樣做,但更重要的是:我有一個帶有'env'目標的頂級Makefile,可以自動執行'virtualenvenv;./env/bin/pipinstall-rrequirements.txt;./env/bin/pythonsetup.pydevelop',通常也是依賴於env的'test'目標,並且還安裝瞭測試依賴項,然後運行py.test。

-pjz 嘗試使用。

啟動項目python_boilerplate 模板。

它主要遵循最佳實踐(例如那些人),但是如果你發現自己願意在某個時刻將你的項目分成多個雞蛋(並且相信我,除瞭最簡單的項目之外的其他任何東西,你會這樣做的話)更適合你。

一個常見的情況是你必須在本地使用-其他人的庫的修改版本)。

你把源頭放在哪裡? 對於規模較大的項目,將源分成幾個蛋是有意義的。

每個雞蛋都將作為一個單獨的setuptools佈局PROJECT_ROOT/src/

你把應用程序啟動腳本放在哪裡? 理想的選擇是將應用程序啟動腳本註冊為entry_point 在其中一個雞蛋中。

你把IDE項目放在哪裡? 取決於IDE。

他們中的許多人保留瞭他們的東西PROJECT_ROOT/. 在項目的根目錄中,這很好。

你在哪裡進行單位/驗收測試? 每個雞蛋都有一套單獨的測試,保存在其中PROJECT_ROOT/src//tests 目錄。

我個人更喜歡使用py.test 運行它們。

你在哪裡放置非Python數據,如配置文件? 這取決於。

可以有不同類型的非Python數據。

“資源”,即必須包裝在雞蛋內的數據。

這些數據進入相應的egg目錄,位於包命名空間內的某個位置。

它可以通過使用pkg_resources 包。

“配置檔案”,即非Python文件,它們被視為項目源文件的外部文件,但在應用程序開始運行時必須使用某些值進行初始化。

在開發過程中,我更喜歡保留這些文件PROJECT_ROOT/config。

對於部署,可以有多種選擇。

在Windows上可以使用%APP_DATA%//config,在Linux上,/etc/ 要麼/opt//config。

生成的文件,即在執行期間可由應用程序創建或修改的文件。

我寧願讓他們進去PROJECT_ROOT/var 在開發期間,以及/var 在Linux部署期間。

你在哪裡為pyd/so二進制擴展模塊放置非Python源代碼如C++? 成PROJECT_ROOT/src//native 文檔通常會進入PROJECT_ROOT/doc 要麼PROJECT_ROOT/src//doc (這取決於你是否認為某些雞蛋是一個單獨的大型項目)。

一些額外的配置將在文件中PROJECT_ROOT/buildout.cfg 和PROJECT_ROOT/setup.cfg。

16 2018-03-2109:17 謝謝你的回答!你為我澄清瞭很多東西!我隻有一個問題:雞蛋可以嵌套嗎?-Shookie不,你不能在其他.egg文件中存儲.egg文件的意義上“嵌套”雞蛋,並希望這會有很多用處[除非你真的很奇怪]。

但是,您可以做的是創建“虛擬”雞蛋-空包,它們不提供任何有用的代碼,但在其依賴項列表中列出其他包。

這樣,當用戶試圖安裝這樣的包時,他將遞歸地安裝許多相關的蛋。

-KT.@KT你能詳細說明如何處理生成的數據嗎?特別是,您(在代碼中)如何區分開發和部署?我想你有一些base_data_location 變量,但你如何設置它?-cmyr我假設你在談論“運行時數據”-人們經常把它放在/var/packagename或〜/.packagename/var之類的東西上。

大多數情況下,這些選擇足以作為您的用戶無需更改的默認選項。

如果你想允許調整這種行為,選項相當豐富,我認為沒有一個適合所有人的最佳實踐。

典型選擇:a)〜/.packagename/configfile,b)導出MY_PACKAGE_CONFIG=/path/to/configfilec)命令行選項或函數參數d)組合。

-KT.請註意,在某處使用單獨的Config類是很常見的,它可以為您處理您喜歡的配置加載邏輯,甚至可以讓用戶在運行時修改設置。

但總的來說,我認為這是一個值得一個單獨問題的問題(可能在此之前的某個地方已經提出過)。

-KT. “PythonPackagingAuthority”有一個示例項目: https://github.com/pypa/sampleproject 它是一個示例項目,作為PythonPackaging用戶指南的包裝和分發項目教程的輔助手段。

16 2018-06-1209:23 根據我的經驗,這隻是一個迭代問題。

將您的數據和代碼放在您認為的任何地方。

機會是,你無論如何都會錯。

但是一旦你更好地瞭解事情將如何形成,你就可以更好地做出這些猜測。

至於擴展源,我們在trunk下有一個Code目錄,其中包含python的目錄和各種其他語言的目錄。

就個人而言,我更傾向於下次嘗試將任何擴展代碼放入自己的存儲庫中。

話雖如此,我回到最初的觀點:不要做太大的交易。

把它放在似乎適合你的地方。

如果你發現一些不起作用的東西,它可以(而且應該)改變。

13 2017-10-1022:57 是的。

我試圖成為“Pythonic”:顯性比隱含更好。

目錄層次的讀取/檢查比寫入更多。

等等..-neuronet 非python數據最好捆綁在你的Python模塊中使用package_data 支持setuptools的。

我強烈建議使用命名空間包來創建多個項目可以使用的共享命名空間,這與將包放入的Java約定非常相似com.yourcompany.yourproject (並且能夠共享com.yourcompany.utils 命名空間)。

重新分支和合並,如果你使用一個足夠好的源控制系統,它將處理合並,即使通過重命名;市場 特別擅長這個。

與此處的其他一些答案相反,我有一個+1src 目錄頂級(帶doc 和test 目錄旁邊)。

文檔目錄樹的具體約定將根據您使用的內容而有所不同;獅身人面像例如,它有自己的快速入門工具支持的約定。

請利用setuptools和pkg_resources;這使得其他項目更容易依賴於代碼的特定版本(如果您正在使用,則可以使用不同的非代碼文件同時安裝多個版本)package_data)。

7 2017-10-1022:39 熱門問題 如何計算git中兩次提交之間更改的行數? 如何使用$scope。

$watch和$scope。

$在AngularJS中申請? 如何清除SQLServer事務日志? 在Python中手動引發(拋出)異常 AngularJS:服務與提供商vs工廠 關於捕獲任何異常 PHP解析/語法錯誤;以及如何解決它們? %~dp0是什麼意思,它是如何工作的? 如何將命令行參數傳遞給批處理文件? 我可以將多個MySQL行連接到一個字段中嗎? 使用CSS替代表格行顏色? 從IList或IEnumerable創建逗號分隔列表 有人可以在Python中解釋__all__嗎? 為什麼我的講師寫的所有C文件都以#開頭? 為什麼不使用Double或Float來表示貨幣? 如何使用可點擊標簽創建HTML復選框 Xcode5中缺少ProvisioningProfiles菜單項 如何運行PowerShell腳本? 使用Gitpush部署項目 如何重命名本地Git分支? licensedunderccby-sa3.0 withattribution. 隱私政策 往來



請為這篇文章評分?