Podczas korzystania z setuptools / Distribute nie mogę pobrać instalatora żadnych package_data
plików. Wszystko, co przeczytałem, mówi, że następujący sposób jest właściwy. Czy ktoś może doradzić?
setup(
name='myapp',
packages=find_packages(),
package_data={
'myapp': ['data/*.txt'],
},
include_package_data=True,
zip_safe=False,
install_requires=['distribute'],
)
gdzie myapp/data/
jest lokalizacja plików danych.
python
setuptools
distribute
cmcginty
źródło
źródło
data_files
rozwiązania problemu. Ale jest to podatne na błędy i nie „wydaje mi się właściwe”. Czy ktoś może sprawdzić, czy naprawdę konieczne jest zduplikowanie konfiguracji w obupackage_data
idata_files
?pyproject.toml
. Nie jestsetup.py
wymagany plik.Odpowiedzi:
Zdaję sobie sprawę, że to stare pytanie, ale dla osób, które trafiają tutaj przez Google:
package_data
to proste, brudne kłamstwo . Jest używany tylko podczas budowania pakietów binarnych (python setup.py bdist ...
), ale nie podczas budowania pakietów źródłowych (python setup.py sdist ...
). Jest to oczywiście absurdalne - można by się spodziewać, że zbudowanie dystrybucji źródłowej zaowocuje kolekcją plików, które można wysłać komuś innemu w celu zbudowania dystrybucji binarnej.W każdym razie użycie
MANIFEST.in
będzie działać zarówno dla dystrybucji binarnych, jak i źródłowych.źródło
package_data
działa dlabdist
i niesdist
. Jednakże ,MANIFEST.in
pracujesdist
, ale nie zabdist
! Dlatego najlepsze, co udało mi się wymyślić, to uwzględnienie obupackage_data
iMANIFEST.in
aby pomieścić zarównobdist
isdist
.MANIFEST.in
dla plików, których nie chcesz zainstalować, takich jak dokumentacja, orazpackage_data
dla plików, których używasz, które nie są kodem Pythona (jak obraz lub szablon).MANIFEST.in
ipackage_data
. Wygląda na to, żeMANIFEST.in
kontroluje to, co jest zawarte w dystrybucji, a package_data kontroluje to, co jest później kopiowane do katalogu site_packages podczas instalacji. Mylące, ścieżki wMANIFEST.in
są względne w stosunku do lokalizacji setup.py ipackage_data
są względne w stosunku do katalogu głównego poszczególnych pakietów (np. Modułów).package_data
automatycznie dołączanych do ZIP, jeśli nie masz istniejącego pliku MANIFEST.in i tylko jeśli używasz wersji 2.7+.Właśnie miałem ten sam problem. Rozwiązaniem było po prostu usunięcie
include_package_data=True
.Po przeczytaniu tutaj zdałem sobie sprawę, że
include_package_data
ma to na celu uwzględnienie plików z kontroli wersji , a nie tylko „dołączanie danych pakietu”, jak sugeruje nazwa. Z dokumentów:Usunięcie tego argumentu naprawiło to, co jest przypadkowym powodem, dla którego działał również po przejściu na distutils, ponieważ nie przyjmuje tego argumentu.
źródło
include_package_data=True
wpisu. Jedynym rozwiązaniem dla mnie jest dodanie wpisu w Manifeście, jak zasugerowano powyżej. Pamiętaj, że używałem setuptools, może twoja wersja działa z 'dystrybucją'?include_package_data
rozwiązuje problem znajduje się dalej w oryginalnym tekście - w przypadku użyciainclude_package_data
argumentu specyficznego dla setuptools pliki określone przezpackage_data
nie zostaną automatycznie dodane do manifestu, chyba że zostaną wymienione wMANIFEST.in
pliku.package_data
ustawienia niepustej listy i określeniainclude_package_data=False
? Dlaczego miałbyś dwukrotnie określać pliki wMANIFEST.in
ipackage_data
?Postępowanie zgodnie z zaleceniem @Joe, aby usunąć
include_package_data=True
linię, również działało dla mnie.Aby rozwinąć trochę więcej, mam żadnego
MANIFEST.in
pliku. Używam Gita, a nie CVS.Repozytorium ma taki kształt:
setup.py
:Używam
python setup.py sdist
dystrybucji źródłowej (nie próbowałem binarnego).A kiedy jestem w zupełnie nowym środowisku wirtualnym, mam
myproject-4.19.tar.gz
plik, i używamPoza tym, że wszystko jest instalowane w moim środowisku wirtualnym
site-packages
, te specjalne pliki danych są instalowane w/opt/local/myproject/data
i/opt/local/myproject/etc
.źródło
include_package_data=True
pracował dla mnie.Jeśli używasz git, pamiętaj, aby uwzględnić
setuptools-git
winstall_requires
. O wiele mniej nudne niż posiadanieManifest
lub włączenie wszystkich ścieżekpackage_data
(w moim przypadku jest to aplikacja django z wszelkiego rodzaju statystyką)( wkleiłem komentarz, który napisałem, ponieważ k3-rnc wspomniał, że jest faktycznie pomocny)
źródło
Aktualizacja : ta odpowiedź jest stara, a informacje nie są już aktualne. Wszystkie konfiguracje setup.py powinny używać
import setuptools
. Dodałem pełniejszą odpowiedź na https://stackoverflow.com/a/49501350/64313Rozwiązałem to, przechodząc na distutils. Wygląda na to, że funkcja dystrybucji jest przestarzała i / lub uszkodzona.
źródło
include_package_data=True
który nie był honorowany. Dzięki temu ustawieniu potrzebujesz tylko pliku MANIFEST.in - nie ma potrzeby duplikowania listy plików wpackage_data
ustawieniu.Starożytne pytanie, a jednak ... zarządzanie pakietami w Pythonie naprawdę pozostawia wiele do życzenia. Tak więc miałem przypadek użycia instalacji przy użyciu pip lokalnie do określonego katalogu i byłem zaskoczony, że ścieżki danych pakietu i plików danych nie wyszły. Nie chciałem dodawać kolejnego pliku do repozytorium, więc ostatecznie wykorzystałem opcję data_files i setup.py --install-data; coś takiego
źródło
Przeniesienie folderu zawierającego dane pakietu do folderu modułu rozwiązało problem.
Zobacz to pytanie: MANIFEST.in zignorowany w "python setup.py install" - nie zainstalowano żadnych plików danych?
źródło
Miałem ten sam problem przez kilka dni, ale nawet ten wątek nie był w stanie mi pomóc, ponieważ wszystko było zagmatwane. Zrobiłem więc swoje badania i znalazłem następujące rozwiązanie:
Pełne inne odpowiedzi na temat przepełnienia stosu tutaj
źródło
Po prostu usuń linię:
ze skryptu instalacyjnego i będzie działać dobrze. (Przetestowane przed chwilą z najnowszymi narzędziami konfiguracyjnymi).
źródło
sdist
ibdist_wheel
, czy sprawdziłeś dlaczego?sdist
ignorujepackage_data
to ustawienie.Korzystanie z setup.cfg (setuptools ≥ 30.3.0)
Począwszy od setuptools 30.3.0 (wydany 2016-12-08), możesz zachować swój
setup.py
bardzo mały rozmiar i przenieść konfigurację dosetup.cfg
pliku. Dzięki temu podejściu możesz umieścić dane pakietu w[options.package_data]
sekcji:W takim przypadku Twój
setup.py
może być tak krótki, jak:Aby uzyskać więcej informacji, zobacz konfigurowanie instalacji przy użyciu plików setup.cfg .
Jest jakaś rozmowa o deprecjację
setup.cfg
na korzyśćpyproject.toml
, jak zaproponowano w PEP 518 , ale to wciąż tymczasowy stan na 2020-02-21.źródło
pip install
.pip install
, ponieważ w przypadku wystarczająco nowoczesnych wersji pip najpierw zbuduje koło, a następnie je zainstaluje. Nadal dla wielu użytkowników to podejście po cichu nie będzie obejmować danych pakietu. Zobacz zaakceptowaną odpowiedź i komentarze pod nią, aby uzyskać szczegółowe informacje. Użycie asetup.cfg
jest tak naprawdę innym sposobem zapisania tego, co OP już robił wsetup.py
pytaniu (przekazującpackage_data
argument słowa kluczowego w wywołaniu dosetup
), więc nie sądzę, aby było to szczególnie pomocne jako odpowiedź na to pytanie . W ogóle nie rozwiązuje podstawowego problemu.