如何组织一个Python项目?
我是Python的新手,我开始一个小型项目。 但是我对如何在“Python方式”中组织文件夹有一些疑问。
我在我的开发环境中使用PyDev,当我创build一个新的项目时,创build一个名为“src”的文件夹
+ src
现在,在PyDev中,我可以创build“Pydev模块”和“PyDev包”
我需要按以下方式组织我的项目:
+ Indicators - Moving_averages.py - Stochastics.py + Strategies - Moving_averages_cross.py - example.py
我怎样才能组织这方面的模块和包? 模块和包的含义是什么?
最好的祝福,
一个包基本上是一个文件夹下有__init__.py
文件,通常是一些模块,其中模块是*.py
文件。 主要与import
。 如果您将__init__.py
添加到指标,您可以使用:
from Indicators.Stochastics import *
要么
from Indicators import Stochastics
顺便说一下,我会build议保持模块/包名称小写。 它不影响function,但更“pythonic”。
从文件系统的angular度来看,模块是一个以.py
结尾的文件,一个包是一个包含模块和(嵌套)包的文件夹。 如果Python包含一个__init__.py
文件,Python会将其识别为一个包。
像这样的文件结构
some/ __init__.py foofoo.py thing/ __init__.py barbar.py
定义了some
包,它有一个barbar
模块和一个嵌套的包,它又有一个模块barbar
。 但是,使用包和模块时,您并没有真正区分这两种types:
import some some.dothis() # dothis is defined in 'some/__init__.py' import some.foofoo # <- module import some.thing # <- package
select命名您的软件包/模块时,请遵循PEP8 (即使用小写字母名称)。
请参阅python-package-template
目录结构
. |-- 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
猫的Makefile
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
您可能想要查看modern-package-template库。 它提供了一种为项目设置一个非常好的基本布局的方法,它会引导您通过几个问题,并尝试帮助您获得可以轻松分发的内容。
在决定一个项目结构之前,最好先问问自己该项目的目标是什么。 这将是一个分析? 你想调查的玩具概念? 你打算分发一个完整的项目? 你想要投入到构build项目中的努力将是不同的。
- 如果是一次性分析,我喜欢使用ipython笔记本 。 笔记本将捕获您的想法stream程,并且可以将标记中的注释添加到您的代码中供以后参考。
- 如果这是一个你想研究的玩具概念,我发现一个简单,快速的方法来最好地工作。 你希望能够快速实现你的概念,发现它是否可行,因此值得花费更多的时间。 Python的哲学的一部分是“不要为了完美而努力,因为”足够好“往往就是这样。 您可以随时回来,按照最佳软件工程实践的方式构build您的项目。
-
如果你想构build你的项目,以便以后可以分发它,并且扩展到很多模块,我推荐以下结构:
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
我喜欢这种结构的详细原因是在我的博客文章中 ,但基本的要点是层次较低的项目名称目录包含您的实际项目。 除此之外,所有帮助pipe理(git)和打包(setup.py,MANIFEST.in)的工具都是如此。
一个包是一个带有__init__.py
的目录。 与目录的区别在于你可以导入它。
本身并没有“Python方式”,但是您会发现将所有模块放在一个与项目名称相关的包中是一个好主意。
另外,要遵循Python风格指南PEP8,包和模块名称应该全部小写。 所以,如果我们假设这个项目被称为“Botond统计”,那么你的结构就是这样的:
botondstats/ indicators/ moving_averages.py stochastics.py strategies/ moving_averages_cross.py example.py
然后,你会发现随机类
from botondstats.indicators.stochastics.Stochastics
(有不同的方式来保持结构,但import更短,但这是另一个问题)。
你可以把这个结构放在src/
如果你想,但没有必要。 我从来没有做。 相反,我有一个主目录:
BotondStatistics/ docs/ botonstats/ # the above structure setup.py # Distutils/distribute configuration for packaging.
在这个目录中,我通常也有一个virtualenv,所以我实际上也有bin / lib / et al。 开发通常是通过运行来完成的
./bin/python setup.py tests
当我使用Distrubutetesting运行器来运行testing。
我就是这样做的。 🙂
试试python_boilerplate_template
:
audreyr
项目包括几个Python项目模板:
该包使用一个~/.cookiecutterrc
文件来创buildPython,Java,JS和其他语言的自定义项目模板。
例如,与PyPI
兼容的Python模板: