← Назад
gmaps_crawler
├── src
│ └── gmaps_crawler
│ ├── __init__.py
│ ├── config.py (форма единственного числа)
│ ├── drivers.py
│ ├── entities.py
│ ├── exceptions.py
│ ├── facades.py
│ ├── main.py (форма единственного числа)
│ └── storages.py
│
├── .gitignore
├── pyproject.toml
└── README.md
Для того чтобы оснастить ваш проект такой возможностью — нужно добавить файл main.py в главный модуль:
<project>
├── src
│ ├── example_module Главный модуль
│ │ ├── __init__.py
│ │ ├── __main__.py Добавьте сюда этот файл
│ │ └── many_files.py
│ │
│ └── tests/*
│ └── many_tests.py
│
├── .gitignore
├── pyproject.toml
└── README.md
И не забудьте, что и тут, в файле main.py, понадобится проверка name == “main”.
Когда вы установите свой модуль — вы сможете запускать его командой вида python -m example_module.
README.rst
LICENSE
setup.py
requirements.txt
sample/__init__.py
sample/core.py
sample/helpers.py
docs/conf.py
docs/index.rst
tests/test_basic.py
tests/test_advanced.py
Project/
|-- bin/
| |-- project
|
|-- project/
| |-- test/
| | |-- __init__.py
| | |-- test_main.py
| |
| |-- __init__.py
| |-- main.py
|
|-- setup.py
|-- README
sound/ Top-level package
__init__.py Initialize the sound package
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
<project_name>/
|
+-- .gitignore # Git configuration
+-- .travis.yml # Travis-CI configuration
+-- bootstrap.py # Buildout bootstrap-script
+-- buildout.cfg # Buildout project configuration
+-- setup.cfg # Configuration for py.test and other tools
+-- README.md # Information on how to use the project
+-- src/ # Directory for keeping (possible multiple) project eggs
|
+- <egg_name>/ # First egg of the project
|
+-- package/ # Python source files
+-- tests/ # Tests
+-- .gitignore # Git configuration
+-- .travis.yml # Travis-CI configuration
+-- setup.cfg # Configuration for py.test and other tools
+-- setup.py # Package metadata
+-- MANIFEST.in # Files to include in the package
+-- README.rst # Package description
+-- LICENSE.txt # License
+-- CHANGELOG.txt # Changelog
project_name
├── docs
│ ├── make.bat
│ ├── Makefile
│ └── source
│ ├── conf.py
│ └── index.rst
├── examples
│ └── example.py
├── src
│ └── package_name
│ └── __init__.py
├── tests
│ └── __init__.py
├── .gitignore
├── LICENSE.txt
├── MANIFEST.in
├── README.rst
├── requirements.txt
├── setup.cfg
├── setup.py
└── tox.ini
helloworld/
│
├── bin/
│
├── docs/
│ ├── hello.md
│ └── world.md
│
├── helloworld/
│ ├── __init__.py
│ ├── runner.py
│ ├── hello/
│ │ ├── __init__.py
│ │ ├── hello.py
│ │ └── helpers.py
│ │
│ └── world/
│ ├── __init__.py
│ ├── helpers.py
│ └── world.py
│
├── data/
│ ├── input.csv
│ └── output.xlsx
│
├── tests/
│ ├── hello
│ │ ├── helpers_tests.py
│ │ └── hello_tests.py
│ │
│ └── world/
│ ├── helpers_tests.py
│ └── world_tests.py
│
├── .gitignore
├── LICENSE
└── README.md
bin/
: В этом каталоге хранятся любые исполняемые файлы. Я адаптировал это из классического сообщения Жан-Поля
Кальдерона о структуре, и его рекомендации по использованию bin/каталога по-прежнему важны. Самый важный момент, который
следует помнить, это то, что в вашем исполняемом файле не должно быть много кода, только импорт и вызов основной функции
в вашем скрипте runner. Если вы используете чистый Python или у вас нет исполняемых файлов, вы можете не использовать
этот каталог.
/docs
: В более продвинутом приложении вам потребуется поддерживать хорошую документацию по всем его частям. Мне
нравится размещать здесь любую документацию по внутренним модулям, поэтому вы видите отдельные документы для helloworld
пакетов и . Если вы используете docstrings в своих внутренних модулях (а вы должны!), Ваша документация по всему модулю
должна, по крайней мере, давать целостное представление о назначении и функциях модуля.
helloworld/
: Это похоже helloworld/ на предыдущую структуру, но теперь есть подкаталоги. По мере усложнения вам
захочется использовать тактику “разделяй и властвуй” и разбивать части логики вашего приложения на более управляемые
фрагменты. Помните, что имя каталога относится к общему имени пакета, и поэтому имена подкаталогов (hello/ и world/)
должны отражать имена их пакетов.
data/
: Наличие этого каталога полезно для тестирования. Это центральное место для любых файлов, которые ваше
приложение будет использовать или создавать. В зависимости от того, как вы развертываете свое приложение, вы можете
сохранить входные и выходные данные “производственного уровня”, указывающие на этот каталог, или использовать его только
для внутреннего тестирования.
tests/
: Здесь вы можете поместить все свои тесты — модульные тесты, тесты выполнения, интеграционные тесты и так
далее. Не стесняйтесь структурировать этот каталог наиболее удобным способом для ваших стратегий тестирования, стратегий
импорта и многого другого. Для получения дополнительной информации о тестировании приложений командной строки с помощью
Python ознакомьтесь с моей статьей 4 “Методы тестирования приложений командной строки (CLI) Python”.
project/
│
├── app/
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ │
│ ├── migrations/
│ │ └── __init__.py
│ │
│ ├── models.py
│ ├── tests.py
│ └── views.py
│
├── docs/
│
├── project/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
│
├── static/
│ └── style.css
│
├── templates/
│ └── base.html
│
├── .gitignore
├── manage.py
├── LICENSE
└── README.md
flaskr/
│
├── flaskr/
│ ├── ___init__.py
│ ├── db.py
│ ├── schema.sql
│ ├── auth.py
│ ├── blog.py
│ ├── templates/
│ │ ├── base.html
│ │ ├── auth/
│ │ │ ├── login.html
│ │ │ └── register.html
│ │ │
│ │ └── blog/
│ │ ├── create.html
│ │ ├── index.html
│ │ └── update.html
│ │
│ └── static/
│ └── style.css
│
├── tests/
│ ├── conftest.py
│ ├── data.sql
│ ├── test_factory.py
│ ├── test_db.py
│ ├── test_auth.py
│ └── test_blog.py
│
├── venv/
│
├── .gitignore
├── setup.py
└── MANIFEST.in
omission-git
├── LICENSE.md
├── omission
│ ├── app.py
│ ├── common
│ │ ├── classproperty.py
│ │ ├── constants.py
│ │ ├── game_enums.py
│ │ └── __init__.py
│ ├── data
│ │ ├── data_loader.py
│ │ ├── game_round_settings.py
│ │ ├── __init__.py
│ │ ├── scoreboard.py
│ │ └── settings.py
│ ├── game
│ │ ├── content_loader.py
│ │ ├── game_item.py
│ │ ├── game_round.py
│ │ ├── __init__.py
│ │ └── timer.py
│ ├── __init__.py
│ ├── __main__.py
│ ├── resources
│ └── tests
│ ├── __init__.py
│ ├── test_game_item.py
│ ├── test_game_round_settings.py
│ ├── test_scoreboard.py
│ ├── test_settings.py
│ ├── test_test.py
│ └── test_timer.py
├── pylintrc
├── README.md
└── .gitignore
You’ll see that I have one top-level package called omission, with four sub-packages: common, data, game, and tests. I also have the directory resources, but that only contains game audio, images, etc. (omitted here for brevity). resources is NOT a package, as it doesn’t contain an init.py.
I also have another special file in my top-level package: main.py. This is the file that is run when we execute our top-level package directly via python -m omission. We’ll talk about what goes in that main.py in a bit.
← Назад