Jak mogę setup.py
dołączyć plik, który nie jest częścią kodu? (W szczególności jest to plik licencji, ale może to być coś innego.)
Chcę mieć możliwość kontrolowania lokalizacji pliku. W oryginalnym folderze źródłowym plik znajduje się w katalogu głównym pakietu. (tj. na tym samym poziomie, co najwyższy __init__.py
). Chcę, aby pozostał dokładnie tam, gdzie pakiet jest zainstalowany, niezależnie od systemu operacyjnego. W jaki sposób mogę to zrobić?
data_files = [('', ['lgpl2.1_license.txt',]),]
umieszcza go w folderze Python26.Odpowiedzi:
Prawdopodobnie najlepszym sposobem na to jest skorzystanie z
setuptools
package_data
dyrektywy. Oznacza to użyciesetuptools
(lubdistribute
) zamiastdistutils
, ale jest to bardzo płynna „aktualizacja”.Oto pełny (ale nieprzetestowany) przykład:
Zwróć uwagę na konkretne wiersze, które są tutaj krytyczne:
package_data
jestdict
nazwą pakietu (pusta = wszystkie pakiety) do listy wzorców (może zawierać globusy). Na przykład, jeśli chcesz określić tylko pliki w pakiecie, możesz to zrobić również:Rozwiązaniem tutaj jest zdecydowanie nie zmiana nazwy
py
plików innych niż pliki z.py
rozszerzeniem.Zobacz prezentację Iana Bickinga, aby uzyskać więcej informacji.
AKTUALIZACJA: Kolejne podejście [lepsze]
Innym podejściem, które działa dobrze, jeśli chcesz kontrolować zawartość źródłowej dystrybucji (
sdist
) i mieć pliki poza pakietem (np. Katalog najwyższego poziomu), jest dodanieMANIFEST.in
pliku. Zobacz dokumentacji Pythona do formatu tego pliku.Od czasu napisania tej odpowiedzi stwierdziłem, że używanie
MANIFEST.in
jest zazwyczaj mniej frustrujące, aby upewnić się, że dystrybucja źródłowa (tar.gz
) zawiera potrzebne pliki.Na przykład, jeśli chcesz dołączyć
requirements.txt
z najwyższego poziomu, rekurencyjnie dołącz katalog „danych” najwyższego poziomu:Niemniej jednak, aby te pliki mogły zostać skopiowane podczas instalacji do folderu pakietu w pakietach witryn, musisz dostarczyć
include_package_data=True
tęsetup()
funkcję. Aby uzyskać więcej informacji, zobacz Dodawanie plików innych niż kodowe .źródło
Aby osiągnąć to, co opisujesz, musisz wykonać dwa kroki ...
Krok 1: Aby dodać plik do źródłowego archiwum, dołącz go do MANIFESTU
Utwórz szablon MANIFEST w folderze, który zawiera setup.py
MANIFEST jest w zasadzie plikiem tekstowym z listą wszystkich plików, które zostaną dołączone do źródłowego archiwum.
Oto jak MANIFEST dla mojego projektu:
Uwaga: Podczas sdist robi dodać kilka plików automatycznie , wolę je jednoznacznie określić, aby mieć pewność, zamiast przewidywania co robi i nie robi.
Krok 2: Aby zainstalować plik danych w folderze źródłowym, zmodyfikuj plik setup.py
Ponieważ chcesz dodać plik danych (LICENSE.txt) do źródłowego folderu instalacyjnego, musisz zmodyfikować ścieżkę instalacji danych, aby była zgodna ze źródłową ścieżką instalacji. Jest to konieczne, ponieważ domyślnie pliki danych są instalowane w innej lokalizacji niż pliki źródłowe.
Aby zmodyfikować katalog instalacji danych, aby pasował do źródłowego katalogu instalacji ...
Wyciągnij informacje o katalogu instalacyjnym z destutils za pomocą:
Zmodyfikuj katalog instalacji danych, aby pasował do źródłowego katalogu instalacji:
I dodaj plik danych i lokalizację do setup ():
Uwaga: powyższe kroki powinny wykonać dokładnie to, co opisano w standardowy sposób, bez konieczności używania bibliotek rozszerzeń.
źródło
package_data
, nie działa, jeśli pliku nie ma w pakiecie.utwórz
MANIFEST.in
w katalogu głównym projektu za pomocąrecursive-include
do wymaganego katalogu lubinclude
z nazwą pliku.dokumentacja znajduje się tutaj
źródło
Chciałem opublikować komentarz do jednego z pytań, ale nie mam wystarczającej reputacji, aby to zrobić>.>
Oto, co zadziałało dla mnie (wymyśliłem to po zapoznaniu się z dokumentami):
Co dziwne, ostatnia linia była dla mnie kluczowa (możesz też pominąć ten argument słowa kluczowego - działa tak samo).
Powoduje to kopiowanie wszystkich plików tekstowych do katalogu najwyższego poziomu lub katalogu głównego (jeden poziom wyżej od pakietu,
mypkg
który chcesz dystrybuować).Mam nadzieję że to pomoże!
źródło
MANIFEST.in
, to zadziałało dla mnie. Ostatnia linia była również dla mnie kluczowa. Moje linie byłyinclude_package_data=False, package_data={ "": ["../CHANGELOG.md"] },
Krok 1: Utwórz
MANIFEST.in
plik w tym samym folderze za pomocą setup.pyKrok 2: dołącz ścieżkę względną do plików, które chcesz dodać
MANIFEST.in
Krok 3: ustaw
include_package_data=True
wsetup()
funkcji kopiowanie tych plików do pakietu witrynyReferencje są tutaj.
źródło
Jest rok 2019 i oto, co działa - pomimo porad tu i tam, to, co znalazłem w Internecie w połowie drogi, jest udokumentowane
setuptools_scm
, przekazane jako opcje dosetuptools.setup
. Obejmuje to wszelkie pliki danych, które są wersjonowane na twoim VCS, czy to git, czy jakikolwiek inny, do pakietu wheel, i spowoduje „instalację pip” z repozytorium git, aby zabrać te pliki ze sobą.Właśnie dodałem te dwie linie do wywołania instalacyjnego na „setup.py”. Nie wymaga dodatkowych instalacji ani importów:
Nie trzeba ręcznie wyświetlać danych pakiet_danych ani pliku MANIFEST.in - jeśli jest wersjonowany, jest dołączany do pakietu. Dokumenty na temat „setuptools_scm” kładą nacisk na tworzenie numeru wersji z pozycji zatwierdzenia i pomijają naprawdę ważną część dodawania plików danych. (Nie obchodzi mnie to, czy mój plik koła pośredniego ma nazwę „* 0.2.2.dev45 + g3495a1f” lub użyję zakodowanego numeru wersji „0.3.0dev0”, który wpisałem - ale pozostawiając kluczowe pliki dla programu praca z tyłu jest nieco ważna)
źródło
W setup.py w setup (:
źródło
package_data
będzie miało wpływu na tosetup.py install
, co robi, chyba że zmodyfikujesz samą komendę install. Chyba że te pliki znajdują się w katalogu pakietu, co zwykle jest rzeczą, której należy unikać.Oto prostsza odpowiedź, która zadziałała dla mnie.
Po pierwsze, zgodnie z powyższym komentarzem Pythona Deva setuptools nie jest wymagane:
To świetnie, ponieważ nałożenie pakietu na setuptools oznacza, że będziesz musiał go również zainstalować. W skrócie:
źródło
pkgame
nie istniejeChciałem tylko sprawdzić coś, co znalazłem podczas pracy z Pythonem 2.7 na Centos 6. Dodanie paczek_danych lub plików_danych, jak wspomniano powyżej, nie działało dla mnie. Dodałem plik MANIFEST.IN z plikami, które chciałem, które umieściły pliki inne niż python w archiwum, ale nie zainstalowałem ich na komputerze docelowym za pośrednictwem RPM.
W końcu udało mi się pobrać pliki do mojego rozwiązania za pomocą „opcji” w setup / setuptools. Pliki opcji pozwalają modyfikować różne sekcje pliku specyfikacji z pliku setup.py. Następująco.
plik - MANIFEST.in:
plik - plik z poleceniami instalacji:
źródło
Wymyśliłem obejście: zmieniłem nazwę
lgpl2.1_license.txt
nalgpl2.1_license.txt.py
i umieściłem potrójne cytaty wokół tekstu. Teraz nie muszę używaćdata_files
opcji ani określać żadnych ścieżek bezwzględnych. Zrobienie z niego modułu Pythona jest brzydkie, ale uważam, że jest mniej brzydkie niż określenie absolutnych ścieżek.źródło