[英]How to organize a Python Project?
我是 Python 新手,正在開始一個迷你項目,但我對如何以“Python 方式”組織文件夾有一些疑問。
我在我的開發環境中使用PyDev
,當我創建一個新項目時,會創建一個名為src
的文件夾
+ src
現在,在PyDev
,我可以創建Pydev Module
和PyDev Package
我需要按以下方式組織我的項目:
+ Indicators
- Moving_averages.py
- Stochastics.py
+ Strategies
- Moving_averages_cross.py
- example.py
我如何根據模塊和包來組織它? 模塊和包的含義是什么?
一個包基本上是一個文件夾,在它下面有__init__.py
文件,通常是一些模塊,其中模塊是一個*.py
文件。 它主要與import
。 如果您將__init__.py
添加到 Indicators 您可以使用:
from Indicators.Stochastics import *
要么
from Indicators import Stochastics
順便說一句,我建議保持模塊/包名稱小寫。 它不會影響功能,但它更“pythonic”。
從文件系統的角度來看,模塊是一個以.py
結尾的文件,包是一個包含模塊和(嵌套)包的文件夾。 如果文件夾包含__init__.py
文件,Python 會將文件夾識別為包。
這樣的文件結構
some/
__init__.py
foofoo.py
thing/
__init__.py
barbar.py
定義包some
,它有一個模塊foofoo
和一個嵌套的包thing
,它再次有一個模塊barbar
。 但是,在使用包和模塊時,您並沒有真正區分這兩種類型:
import some
some.dothis() # dothis is defined in 'some/__init__.py'
import some.foofoo # <- module
import some.thing # <- package
選擇命名包/模塊時請遵循PEP8 (即使用小寫名稱)。
目錄結構
.
|-- bin
| `-- my_program
|-- docs
| `-- doc.txt
|-- my_program
| |-- data
| | `-- some_data.html
| |-- __init__.py
| |-- submodule
| | `-- __init__.py
| |-- helpers.py
|-- tests
| |-- __init__.py
| |-- test_helpers.py
|-- Makefile
|-- CHANGES.txt
|-- LICENSE.txt
|-- README.md
|-- requirements-dev.txt
|-- requirements.txt
`-- setup.py
貓生成文件
PYTHON=`which python`
NAME=`python setup.py --name`
all: check test source deb
init:
pip install -r requirements.txt --use-mirrors
dist: source deb
source:
$(PYTHON) setup.py sdist
deb:
$(PYTHON) setup.py --command-packages=stdeb.command bdist_deb
rpm:
$(PYTHON) setup.py bdist_rpm --post-install=rpm/postinstall --pre-uninstall=rpm/preuninstall
test:
unit2 discover -s tests -t .
python -mpytest weasyprint
check:
find . -name \*.py | grep -v "^test_" | xargs pylint --errors-only --reports=n
# pep8
# pyntch
# pyflakes
# pychecker
# pymetrics
clean:
$(PYTHON) setup.py clean
rm -rf build/ MANIFEST dist build my_program.egg-info deb_dist
find . -name '*.pyc' -delete
您可能想查看現代包模板庫。 它提供了一種為項目設置非常好的基本布局的方法,它會引導您解決一些問題,並嘗試幫助您獲得能夠相當容易地分發的東西。
在決定項目結構之前,最好先問問自己項目的目的是什么。 這將是一次性分析嗎? 您想研究的玩具概念? 您打算分發一個完整的項目? 您想要在構建項目時付出的努力會有所不同。
如果您想構建您的項目以便以后可以分發它,並使其擴展到許多模塊,我建議使用以下結構:
projectname ├── MANIFEST.in ├── setup.py ├── README ├── .gitignore ├── .git ├── projectname_env └── projectname ├── __init__.py ├── subpackageone │ ├── __init__.py │ ├── second_module.py │ ├── tests │ │ └── test_second_module.py │ └── models │ └── model1 ├── first_module.py └── tests └── test_second_module.py
我喜歡這種結構的詳細原因 在我的博客文章中,但基本要點是分層較低級別的projectname
目錄包含您的實際項目。 除了它之外,還有幫助管理 (git) 和打包 (setup.py, MANIFEST.in) 的所有工具。
包是一個包含__init__.py
的目錄。 與目錄的不同之處在於您可以導入它。
本身並沒有“Python 方式”,但您會發現將所有模塊放在一個具有與項目相關的名稱的包中是個好主意。
此外,為了遵循 Python 風格指南 PEP8,包和模塊名稱應全部小寫。 因此,如果我們假設該項目稱為“Botond Statistics”,那么您的結構將是這樣的:
botondstats/
indicators/
moving_averages.py
stochastics.py
strategies/
moving_averages_cross.py
example.py
然后,您將通過執行以下操作找到 Stochastics 類
from botondstats.indicators.stochastics.Stochastics
(有多種方法可以保持結構但使導入更短,但這是另一個問題)。
如果您願意,可以將此結構放在src/
下,但這不是必需的。 我從來沒有做。 相反,我有一個主目錄:
BotondStatistics/
docs/
botonstats/ # the above structure
setup.py # Distutils/distribute configuration for packaging.
在這個目錄中,我通常也有一個 virtualenv,所以我實際上也有 bin/lib/ 等。 開發通常通過運行來完成
./bin/python setup.py tests
因為我使用 Distrubute 測試運行器來運行測試。
我就是這樣做的。 :-)
試試python_boilerplate_template
:
在cookiecutter
的項目audreyr
包括一些Python項目模板:
該包使用單個~/.cookiecutterrc
文件以 Python、Java、JS 和其他語言創建自定義項目模板。
例如,與PyPI
兼容的 Python 模板:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.