Jak dołączyć dane pakietu do setuptools / distribute?

Podczas korzystania z setuptools / distribute, nie mogę zmusić instalatora do wciągnięcia żadnego package_data Pliki. Wszystko, co przeczytałem, mówi, że poniższy sposób jest prawidłowy. 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 lokalizacją plików danych.

Author: Piotr Dobrogost, 2011-09-23

7 answers

Zdaję sobie sprawę, że to stare pytanie...ale dla ludzi, którzy znaleźli drogę tutaj przez Google: package_data jest niskim, brudne kłamstwo . Jest on używany tylko podczas budowania binarnych pakietów (python setup.py bdist ...), ale nie podczas budowania pakietów źródłowych (python setup.py sdist ...). Jest to oczywiście niedorzeczne-można by się spodziewać, że zbudowanie dystrybucji źródłowej skutkowałoby zbiorem plików, które mogłyby zostać wysłane do kogoś innego w celu zbudowania dystrybucji binarnej.

W każdym przypadku, za pomocą MANIFEST.in będzie działać zarówno dla dystrybucji binarnych, jak i źródłowych.

 201
Author: larsks,
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-04-30 14:26:09

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_datama na celu dołączanie plików z kontroli wersji, w przeciwieństwie do "dołączania danych pakietu", jak sama nazwa wskazuje. Z docs:

Pliki danych [z include_package_data] muszą znajdować się pod kontrolą CVS lub Subversion

...

Jeśli chcesz mieć dokładniejszą kontrolę nad tym, jakie pliki są dołączane (na przykład, jeśli ty mieć pliki dokumentacji w katalogach pakietów i chcesz wykluczyć ich z instalacji), wtedy można również użyć słowa kluczowego package_data.

Usunięcie tego argumentu naprawiło to, co jest przypadkiem, dlaczego działało również po przełączeniu na distutils, ponieważ nie bierze tego argumentu.

 21
Author: Joe,
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
2012-12-09 01:50:37

Zgodnie z zaleceniem @ Joe, aby usunąć include_package_data=True wiersz również zadziałał dla mnie.

Aby rozwinąć trochę więcej, mam Nie MANIFEST.in Plik. Używam Git a nie CVS.

Repozytorium przyjmuje taki kształt:

/myrepo
    - .git/
    - setup.py
    - myproject
        - __init__.py
        - some_mod
            - __init__.py
            - animals.py
            - rocks.py
        - config
            - __init__.py
            - settings.py
            - other_settings.special
            - cool.huh
            - other_settings.xml
        - words
            - __init__.py
            word_set.txt

setup.py:

from setuptools import setup, find_packages
import os.path

setup (
    name='myproject',
    version = "4.19",
    packages = find_packages(),  
    # package_dir={'mypkg': 'src/mypkg'},  # didnt use this.
    package_data = {
        # If any package contains *.txt or *.rst files, include them:
        '': ['*.txt', '*.xml', '*.special', '*.huh'],
    },

#
    # Oddly enough, include_package_data=True prevented package_data from working.
    # include_package_data=True, # Commented out.
    data_files=[
#               ('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
        ('/opt/local/myproject/etc', ['myproject/config/settings.py', 'myproject/config/other_settings.special']),
        ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'cool.huh')]),
#
        ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'other_settings.xml')]),
        ('/opt/local/myproject/data', [os.path.join('myproject/words', 'word_set.txt')]),
    ],

    install_requires=[ 'jsonschema',
        'logging', ],

     entry_points = {
        'console_scripts': [
            # Blah...
        ], },
)

Uruchamiam python setup.py sdist dla źródłowego distrib (nie próbowałem binarnego).

A gdy w zupełnie nowym środowisku wirtualnym mam myproject-4.19.tar.gz, Plik, i używam

(venv) pip install ~/myproject-4.19.tar.gz
...

I inne niż wszystko, co zostanie zainstalowane do mojego środowiska wirtualnego site-packages, te specjalne pliki danych są instalowane do /opt/local/myproject/data i /opt/local/myproject/etc.

 13
Author: HeyWatchThis,
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-05-29 14:59:02

include_package_data=True dla mnie zadziałało.

Jeśli używasz Gita, pamiętaj o dodaniu setuptools-git do install_requires. O wiele mniej nudne niż posiadanie Manifest lub włączenie wszystkich ścieżek w package_data (w moim przypadku jest to aplikacja django ze wszystkimi rodzajami statyki)

( wklejony komentarz zrobiłem, jak k3-RNC wspomniałem, że faktycznie jest pomocny jak jest)

 9
Author: vincent,
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-05-23 12:34:51

Update: Ta odpowiedź jest stara i informacje nie są już ważne. Wszystkie setup.py configs powinien używać import setuptools. Dodałem pełniejszą odpowiedź na https://stackoverflow.com/a/49501350/64313


Rozwiązałem to, przełączając się na distutils. Wygląda na to, że dystrybucja jest przestarzała i / lub zepsuta.

from distutils.core import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_data={
      'myapp': ['data/*.txt'],
   },
)
 4
Author: cmcginty,
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
2018-03-27 20:27:42

Starożytne pytanie i jeszcze... Zarządzanie pakietami w Pythonie naprawdę pozostawia wiele do życzenia. Miałem więc przypadek użycia instalacji przy użyciu PIP lokalnie do określonego katalogu i byłem zaskoczony, że obie ścieżki package_data i data_files nie działają. Nie chciało mi się dodawać kolejnego pliku do repo, więc skończyło się na wykorzystaniu data_files i setup.py option --install-data; coś takiego

pip install . --install-option="--install-data=$PWD/package" -t package  
 2
Author: Mat Baker,
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-09 23:07:23

Przeniesienie folderu zawierającego dane pakietu do folderu modułu rozwiązało problem.

Zobacz to pytanie: MANIFEST.in ignored on "python setup.py install" - brak zainstalowanych plików danych?

 0
Author: exhuma,
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-05-23 10:31:37