Jak zorganizować projekt Pythona?
Jestem nowy w Pythonie i zaczynam projekt mini. ale mam pewne wątpliwości, jak zorganizować foldery w "sposób Pythona".
Używam PyDev w moim środowisku programistycznym, a kiedy tworzę nowy projekt, tworzony jest folder o nazwie "src"
+ src
Teraz w PyDev mogę utworzyć "Pydev Module "i"PyDev Package"
Muszę zorganizować mój projekt w następujący sposób:
+ Indicators
- Moving_averages.py
- Stochastics.py
+ Strategies
- Moving_averages_cross.py
- example.py
Jak mogę to zorganizować w kategoriach modułów i pakietów? Co to jest znaczenie modułów i pakietów?
Pozdrawiam,
8 answers
Pakiet jest w zasadzie folderem zawierającym plik __init__.py
i zazwyczaj niektóre moduły, gdzie moduł jest plikiem *.py
.
Ma to głównie związek z import
. Jeśli dodasz __init__.py
do wskaźników możesz użyć:
from Indicators.Stochastics import *
Lub
from Indicators import Stochastics
Przy okazji, zalecałbym, aby nazwy modułów/pakietów były pisane małymi literami. Nie wpływa to na funkcjonalność, ale jest bardziej "pythoniczny".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 13:47:49
Z punktu widzenia systemu plików, moduł jest plikiem kończącym się na .py
, A Pakiet jest folderem zawierającym ponownie moduły i (zagnieżdżone) Pakiety. Python rozpoznaje folder jako pakiet, jeśli zawiera plik __init__.py
.
Taka struktura plików
some/
__init__.py
foofoo.py
thing/
__init__.py
barbar.py
Definiuje pakiet some
, który ma moduł foofoo
i zagnieżdżony pakiet thing
, który ponownie ma moduł barbar
. Jednak podczas korzystania z Pakietów i modułów nie rozróżnia się tych dwóch rodzaje:
import some
some.dothis() # dothis is defined in 'some/__init__.py'
import some.foofoo # <- module
import some.thing # <- package
Proszę postępować zgodnie z PEP8 podczas wybierania nazw pakietów/modułów(np. używaj nazw małych liter).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 13:49:35
Zobacz python-package-template
Struktura katalogów
.
|-- 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
Cat 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-23 04:06:57
Możesz sprawdzić bibliotekę modern-package-template. Zapewnia sposób na skonfigurowanie naprawdę ładnego podstawowego układu dla projektu, który przeprowadzi Cię przez kilka pytań i stara się pomóc ci uzyskać coś, co jest w stanie być dystrybuowane dość łatwo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 14:43:49
Przed podjęciem decyzji o strukturze projektu, warto zadać sobie pytanie, jaki będzie cel projektu. Czy to będzie jednorazowa analiza? Pomysł na zabawkę, który chcesz zbadać? Pełny projekt, który zamierzasz rozpowszechniać? Ilość wysiłku, który chcesz włożyć w strukturyzację projektu, będzie inna.
- jeśli jest to analiza Jednorazowa, lubię używać notebooków ipython . Notatnik uchwyci przepływ twoich myśli i możesz dodawać notatki w znaczniki do kodu w celu późniejszego odniesienia.
- jeśli chodzi o koncepcję zabawek, którą chcesz zbadać, znajduję proste, szybkie podejście do pracy najlepiej. Chcesz być w stanie szybko wdrożyć swoją koncepcję, aby dowiedzieć się, czy jest ona w ogóle wykonalna, a tym samym warto poświęcić na nią więcej czasu. Częścią filozofii Pythona jest "nie próbuj dążyć do perfekcji, ponieważ" wystarczająco dobry " jest często tylko tym."Zawsze możesz wrócić później i uporządkować swój projekt w sposób zgodny z najlepszą inżynierią oprogramowania praktyki.
-
Jeśli chcesz uporządkować swój projekt tak, aby można go później dystrybuować i tak, aby skalował się do wielu modułów, polecam następującą strukturę:
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
Szczegółowe powody, dla których lubię tę strukturę są w moim poście na blogu, ale podstawowym gist jest to, że hierarchicznie niższy poziom projectname
katalog zawiera Twój rzeczywisty projekt. Obok niego znajdują się wszystkie narzędzia wspomagające zarządzanie (git) i pakiet (setup.py, MANIFEST.in) it.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-28 17:42:46
Pakiet jest katalogiem z __init__.py
w nim. Różnica w stosunku do katalogu polega na tym, że można go zaimportować.
Nie ma "sposobu Pythona" jako takiego, ale przekonasz się, że dobrym pomysłem jest umieszczenie wszystkich modułów w jednym pakiecie o nazwie związanej z projektem.
Ponadto, aby postępować zgodnie z przewodnikiem po stylu Pythona, PEP8, nazwy pakietów i modułów powinny być pisane małymi literami. Jeśli więc założymy, że projekt nazywa się "Botond Statistics", twoja struktura będzie czymś w rodzaju to:
botondstats/
indicators/
moving_averages.py
stochastics.py
strategies/
moving_averages_cross.py
example.py
Następnie znajdziesz klasę Stochastyki wykonując
from botondstats.indicators.stochastics.Stochastics
(istnieją różne sposoby na utrzymanie struktury, ale skrócenie importu, ale to inne pytanie).
Możesz umieścić tę strukturę pod src/
, jeśli chcesz, ale nie jest to konieczne. Nigdy tego nie robię.
Zamiast tego mam katalog główny:
BotondStatistics/
docs/
botonstats/ # the above structure
setup.py # Distutils/distribute configuration for packaging.
W tym katalogu zazwyczaj mam virtualenv więc mam też bin / lib / et al. Rozwój odbywa się zazwyczaj przez running
./bin/python setup.py tests
Ponieważ używam Distrubute test runner do wykonywania testów.
Tak to robię. :-)Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 13:57:02
Try python_boilerplate_template
:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-20 02:31:41
The cookiecutter
project by audreyr
zawiera kilka szablonów projektów Pythona:
Pakiet używa pojedynczego pliku ~/.cookiecutterrc
do tworzenia niestandardowych szablonów projektów w Pythonie, Javie, JS i innych językach.
Na przykład szablon Pythona zgodny z PyPI
:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-10 14:08:58