Wyobraź sobie, że chcesz opracować w Pythonie nietrywialną aplikację komputerową dla użytkowników końcowych (nie WWW). Jaki jest najlepszy sposób na uporządkowanie hierarchii folderów projektu?
Pożądanymi cechami są łatwość konserwacji, łatwość obsługi IDE, przydatność do rozgałęziania / łączenia kontroli źródła oraz łatwe generowanie pakietów instalacyjnych.
W szczególności:
- Gdzie umieszczasz źródło?
- Gdzie umieszczasz skrypty uruchamiania aplikacji?
- Gdzie kładziesz cruft projektu IDE?
- Gdzie umieszczasz testy jednostkowe / akceptacyjne?
- Gdzie umieszczasz dane inne niż Python, takie jak pliki konfiguracyjne?
- Gdzie umieszczasz źródła inne niż Python, takie jak C ++ dla binarnych modułów rozszerzeń pyd / so?
Według struktury systemu plików Jeana-Paula Calderone'a projektu Python :
źródło
Project/project/
? Ach, drugi to nazwa pakietu.../
w instrukcji include)pip install -e /path/to/Project
)-e
flagą, która instaluje pakiet jako pakiet edytowalny, to znaczy instaluje go jako łącza do rzeczywistego folderu projektu. Plik wykonywalny może wtedyimport project
mieć tylko dostęp do modułu.Ten post na blogu autorstwa Jeana-Paula Calderone'a jest często podawany jako odpowiedź w #python na Freenode.
źródło
Sprawdź Open Sourcing projektu Python we właściwy sposób .
Pozwólcie mi wyciągnąć część dotyczącą układu tego znakomitego artykułu:
źródło
Makefile
na tym samym poziomie cosetup.py
? Więc jeśli rozumiem, że poprawniemake env
automatyzujesz tworzenie nowegovenv
i instalujesz w nim pakiety ...?„Python Packaging Authority” ma sampleproject:
https://github.com/pypa/sampleproject
Jest to przykładowy projekt, który stanowi pomoc dla samouczka Python Packaging User Guide na temat pakowania i dystrybucji projektów.
źródło
root/src/*
struktury: github.com/pypa/sampleproject/commit/…Spróbuj uruchomić projekt przy użyciu szablonu python_boilerplate . W dużej mierze postępuje zgodnie z najlepszymi praktykami (np. Tymi tutaj ), ale lepiej nadaje się w przypadku, gdy w pewnym momencie okaże się, że chcesz podzielić swój projekt na więcej niż jedno jajko (i wierz mi, jeśli chodzi o coś innego niż najprostsze projekty, zrobisz to. często zdarza się, że musisz użyć lokalnie zmodyfikowanej wersji biblioteki innej osoby).
Gdzie umieszczasz źródło?
PROJECT_ROOT/src/<egg_name>
.Gdzie umieszczasz skrypty uruchamiania aplikacji?
entry_point
jednego z jaj.Gdzie kładziesz cruft projektu IDE?
PROJECT_ROOT/.<something>
katalogu głównym projektu i jest w porządku.Gdzie umieszczasz testy jednostkowe / akceptacyjne?
PROJECT_ROOT/src/<egg_name>/tests
katalogu. Osobiście wolę używać ichpy.test
do uruchamiania.Gdzie umieszczasz dane inne niż Python, takie jak pliki konfiguracyjne?
pkg_resources
pakiet zsetuptools
lub od Pythona 3.7 przezimportlib.resources
moduł ze standardowej biblioteki.PROJECT_ROOT/config
. W przypadku wdrożenia mogą istnieć różne opcje. W systemie Windows można użyć%APP_DATA%/<app-name>/config
, w systemie Linux/etc/<app-name>
lub/opt/<app-name>/config
.PROJECT_ROOT/var
podczas programowania i/var
podczas wdrażania systemu Linux.PROJECT_ROOT/src/<egg_name>/native
Dokumentacja zwykle przechodzi do
PROJECT_ROOT/doc
lubPROJECT_ROOT/src/<egg_name>/doc
(zależy to od tego, czy traktujesz niektóre jajka jako osobne duże projekty). Niektóre dodatkowe konfiguracje będą w plikach takich jakPROJECT_ROOT/buildout.cfg
iPROJECT_ROOT/setup.cfg
.źródło
base_data_location
zmienną, ale jak ją odpowiednio ustawić?Z mojego doświadczenia wynika, że to tylko kwestia iteracji. Umieść swoje dane i kod w dowolnym miejscu. Możliwe, że i tak się pomylisz. Ale kiedy już zrozumiesz, jak dokładnie wszystko się ukształtuje, będziesz w znacznie lepszej sytuacji, aby zgadywać tego rodzaju domysły.
Jeśli chodzi o źródła rozszerzeń, pod katalogiem głównym znajduje się katalog Code zawierający katalog dla Pythona i katalog dla różnych innych języków. Osobiście jestem bardziej skłonny, aby następnym razem umieścić kod rozszerzenia we własnym repozytorium.
Powiedziawszy to, wracam do pierwotnego punktu: nie rób z tego zbyt wielkiego interesu. Połóż to w miejscu, które wydaje się działać dla Ciebie. Jeśli znajdziesz coś, co nie działa, można (i należy) to zmienić.
źródło
Dane niebędące pythonami najlepiej jest umieszczać w modułach Pythona, korzystając z
package_data
obsługi setuptools . Jedną rzeczą, którą zdecydowanie polecam, jest używanie pakietów przestrzeni nazw do tworzenia wspólnych przestrzeni nazw, z których może korzystać wiele projektów - podobnie jak konwencja Java umieszczania pakietówcom.yourcompany.yourproject
(i możliwość posiadania wspólnejcom.yourcompany.utils
przestrzeni nazw).Ponownie rozgałęzianie i scalanie, jeśli użyjesz wystarczająco dobrego systemu kontroli źródła, będzie on obsługiwał scalanie nawet poprzez zmianę nazw; Bazar jest w tym szczególnie dobry.
W przeciwieństwie do niektórych innych odpowiedzi tutaj, jestem na +1 o
src
katalogu najwyższego poziomu (zdoc
itest
katalogi obok). Konkretne konwencje dotyczące drzew katalogów dokumentacji będą się różnić w zależności od tego, czego używasz; Na przykład Sphinx ma własne konwencje, które obsługuje narzędzie szybkiego startu.Proszę, skorzystaj z setuptools i pkg_resources; znacznie ułatwia to innym projektom poleganie na określonych wersjach kodu (i jednoczesne instalowanie wielu wersji z różnymi plikami innymi niż kod, jeśli używasz
package_data
).źródło