[英]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.