सेटटॉपल्स / डिस्ट्रीब्यूशन के साथ पैकेज डेटा कैसे शामिल करें?


137

सेटपूल / डिस्ट्रिब्यूट का उपयोग करते समय, मुझे किसी भी package_dataफाइल में खींचने के लिए इंस्टॉलर नहीं मिल सकता है । मैंने जो कुछ पढ़ा है वह कहता है कि यह करने का सही तरीका है। क्या कोई सलाह दे सकता है?

setup(
   name='myapp',
   packages=find_packages(),
   package_data={
      'myapp': ['data/*.txt'],
   },
   include_package_data=True,
   zip_safe=False,
   install_requires=['distribute'],
)

myapp/data/डेटा फ़ाइलों का स्थान कहां है।


2
मैं एक ही समस्या आ रही है ... मैन्युअल रूप से निर्दिष्ट data_filesसमस्या को हल किया। लेकिन यह त्रुटि-प्रवण है और मुझे "सही नहीं" लगता है। क्या कोई यह सत्यापित कर सकता है कि दोनों में विन्यास की नकल करना वास्तव में आवश्यक है package_dataऔर data_files?
exhuma

github.com/wimglenn/resources-example एक आधुनिक सेटपाउल्ट्स प्रोजेक्ट संरचना दिखाता है, जो डेटा फ़ाइलों को पहियों और sdists का उपयोग करके सही ढंग से पैकेज कर सकता है pyproject.toml। कोई setup.pyफ़ाइल की आवश्यकता नहीं है।
विम

जवाबों:


289

मुझे एहसास है कि यह एक पुराना सवाल है, लेकिन Google के माध्यम से यहां अपना रास्ता खोजने वाले लोगों के लिए: package_dataएक नीचा, गंदा झूठ है । यह केवल जब निर्माण किया जाता है बाइनरी (संकुल python setup.py bdist ...), लेकिन नहीं जब स्रोत संकुल का निर्माण ( python setup.py sdist ...)। यह निस्संदेह, हास्यास्पद है - कोई यह उम्मीद करेगा कि स्रोत वितरण के निर्माण से उन फ़ाइलों का एक संग्रह हो जाएगा जो बाइनरी वितरण के लिए किसी और को भेजे जा सकते हैं।

किसी भी स्थिति में, उपयोग बाइनरी और स्रोत वितरण के लिए दोनोंMANIFEST.in काम करेगा ।


97
मैं पिछले एक घंटे से इस मुद्दे पर शोध कर रहा हूं और कई दृष्टिकोण आजमा रहा हूं। जैसा कि आप कहते हैं, के लिए package_dataकाम करता है bdistऔर नहीं sdistहालांकि , MANIFEST.inके लिए काम करता sdistहै, लेकिन नहीं के लिए bdist! इसलिए, सबसे अच्छा मैं साथ आने के लिए सक्षम किया गया है दोनों शामिल करना है package_dataऔर MANIFEST.inदोनों को समायोजित करने के bdistलिए और sdist
वेस्ले बो

7
मुझे @WesleyBaugh का समर्थन करने के लिए एक और मिला। Stackoverflow.com/a/2969087/261718 में , उन MANIFEST.inफ़ाइलों के package_dataलिए उपयोग करें जिन्हें आप इंस्टॉल नहीं करेंगे, जैसे प्रलेखन, और आपके द्वारा उपयोग की जाने वाली फ़ाइलों के लिए जो Python कोड नहीं हैं (जैसे कोई छवि या टेम्पलेट)।
ड्रेक गुआन

12
मैं sdist उपयोग कर रहा हूँ, और दोनों को शामिल करने के लिए किया था MANIFEST.in और package_data । ऐसा लगता है कि MANIFEST.inवितरण में क्या शामिल है, यह नियंत्रित करता है, और package_data नियंत्रित करता है कि बाद में स्थापना के दौरान site_packages dir में क्या कॉपी किया जाता है। भ्रामक रूप से, पथ MANIFEST.inसेटअप सेटअप के स्थान के सापेक्ष हैं, और package_dataव्यक्तिगत संकुल (जैसे मॉड्यूल) रूट के सापेक्ष हैं।
एडवर्ड नेवेल

9
"संस्करण 2.7 में परिवर्तित: पैकेज_डटा से मेल खाने वाली सभी फाइलें मैनिफ़ेस्ट फ़ाइल में जोड़ी जाएंगी यदि कोई टेम्पलेट प्रदान नहीं किया गया है। वितरित करने के लिए फ़ाइलों को निर्दिष्ट करना देखें।" डिस्टल्यूट से । इसलिए, यदि आपके पास कोई मौजूदा MANIFEST.in फ़ाइल नहीं है , और केवल 2.7+ का उपयोग कर रहे हैं, तो आपको केवल package_dataज़िप में स्वचालित रूप से शामिल होने वाली फ़ाइलों का व्यवहार दिखाई देगा ।
जॉनस

29
सच में, मुझे ऐसा लगता है कि यह टिकट लोगों के लिए समूह थैरेपी सेशन है जिसमें सेटपूल का उपयोग किया गया है और यह पता लगाया है कि जीवन में उन्होंने खुद को कितना भयानक स्थान दिया है।
मैट जॉयस

32

मेरा बस यही मुद्दा था। समाधान, बस को दूर करना था include_package_data=True

यहां पढ़ने के बाद , मुझे एहसास हुआ कि include_package_dataइसका मतलब संस्करण नियंत्रण से फाइलें शामिल करना है , जैसा कि नाम का अर्थ है "पैकेज डेटा शामिल करें" के विपरीत। डॉक्स से:

[Files_package_data] की डेटा फ़ाइलें CVS या तोड़फोड़ नियंत्रण के अंतर्गत होनी चाहिए

...

यदि आप चाहते हैं कि फ़ाइलों को शामिल करने के लिए महीन दानेदार नियंत्रण (उदाहरण के लिए, यदि आपके पैकेज निर्देशिकाओं में दस्तावेज़ीकरण फ़ाइलें हैं और उन्हें स्थापना से बाहर करना चाहते हैं), तो आप package_dataकीवर्ड का उपयोग भी कर सकते हैं ।

उस तर्क को बाहर निकालते हुए, यह संयोग है कि संयोगवश यह क्यों काम किया जब आपने डिस्टिलिट्स पर स्विच किया, क्योंकि यह उस तर्क को नहीं लेता है।


2
मेरा अनुभव अलग है, मुझे include_package_data=Trueप्रविष्टि को शामिल किए बिना एक ही समस्या थी । मेरे लिए केवल समाधान मैनिफेस्ट में एक प्रविष्टि जोड़ना है जैसा कि ऊपर बताया गया है। माइंड यू, मैं सेटप्टूल का उपयोग कर रहा था, हो सकता है कि आपका संस्करण 'डिस्ट्रीब्यूशन' के साथ काम करे?
टिमस्टेली

4
मूलinclude_package_data समस्या को हटाने का वास्तविक कारण मूल पाठ में आगे है - यदि सेटप्टूलस-विशिष्ट include_package_dataतर्क का उपयोग करते हैं , तो निर्दिष्ट फ़ाइलों package_dataको तब तक स्वचालित रूप से प्रकट में जोड़ा नहीं जाएगा जब तक कि वे MANIFEST.inफ़ाइल में सूचीबद्ध न हों ।
पायोत्र डोब्रोगोस्ट 12

package_dataगैर-रिक्त सूची पर सेट करने और निर्दिष्ट करने का उपयोग मामला क्या है include_package_data=False? और क्यों आप में दो बार फ़ाइलों को निर्दिष्ट करने की आवश्यकता होगी MANIFEST.inऔर package_data?
हरबर्ट

21

@Joe की include_package_data=Trueलाइन हटाने की सिफारिश के बाद मेरे लिए भी काम किया।

थोड़ा और विस्तृत करने के लिए, मेरे पास कोई MANIFEST.in फ़ाइल नहीं है। मैं गिट का उपयोग करता हूं और सीवीएस का नहीं।

रिपोजिटरी इस तरह का आकार लेती है:

/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...
        ], },
)

मैं python setup.py sdistएक स्रोत डिस्ट्रीब के लिए दौड़ता हूं (बाइनरी की कोशिश नहीं की है)।

और जब एक नए आभासी वातावरण के अंदर, मेरे पास एक myproject-4.19.tar.gz, फ़ाइल, और मैं उपयोग करता हूं

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

और मेरे आभासी वातावरण में स्थापित होने के अलावा site-packages, उन विशेष डेटा फ़ाइलों को स्थापित करने के लिए /opt/local/myproject/dataऔर /opt/local/myproject/etc


16

include_package_data=True मेरे लिए काम किया।

आप Git उपयोग करते हैं, शामिल करने के लिए याद setuptools-gitमें install_requires। सभी तरह से Manifestया जिसमें package_dataमेरे मामले में यह सभी प्रकार के स्टैटिक्स के साथ एक django ऐप है, की तुलना में बहुत कम उबाऊ है

(टिप्पणी जो मैंने की, उसे k3-rnc के रूप में उल्लिखित किया, जो वास्तव में मददगार है।


7

अद्यतन : यह उत्तर पुराना है और जानकारी अब मान्य नहीं है। सभी setup.py विन्यास का उपयोग करना चाहिए import setuptools। मैंने https://stackoverflow.com/a/49501350/64313 पर अधिक पूर्ण उत्तर जोड़ा है


मैंने इसे डिस्टल्यूट पर स्विच करके हल किया। ऐसा लगता है कि वितरण वितरित और / या टूटा हुआ है।

from distutils.core import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_data={
      'myapp': ['data/*.txt'],
   },
)

2
वितरण में कमी नहीं की गई है, यह डिस्टल्यूट की जगह ले रहा है । मुझे नहीं पता कि आपको समस्या क्यों हो रही है, लेकिन यह कारण नहीं है।
agf

1
आईआरसी से मुझे यही प्रतिक्रिया मिली, तो मैं किसे मानता हूं? यदि आपके पास वितरण का उपयोग करके एक काम करने वाला उदाहरण है तो मैं सराहना करूंगा।
cmcginty

6
स्पष्टीकरण: वितरण का अर्थ सेटप्टूल को बदलने के लिए है, दोनों को डिस्टुटिल्स के शीर्ष पर बनाया गया है। डिस्टुटिल्स को अंततः एक नए पैकेज से बदल दिया जाएगा, जिसे python2 में "distutils2" कहा जाता है और python3 में "पैकेजिंग"
केविन हॉर्न

1
डिस्टल्यूट पर स्विच करने से मेरी समस्या हल हो गई जहां include_package_data=Trueसम्मानित नहीं किया जा रहा था। तो उस सेटिंग के साथ आपको केवल MANIFEST.in की आवश्यकता है - package_dataसेटिंग में अपनी फ़ाइल सूची को डुप्लिकेट करने की आवश्यकता नहीं है ।
डैनियल सोकोलोव्स्की

4

प्राचीन प्रश्न और अभी तक ... अजगर का पैकेज प्रबंधन वास्तव में वांछित होने के लिए बहुत कुछ छोड़ देता है। इसलिए मेरे पास एक निर्दिष्ट निर्देशिका में स्थानीय रूप से पाइप का उपयोग करने का उपयोग करने का मामला था और यह हैरान था कि दोनों पैकेज_डेटा और डेटा_फाइल्स पथ काम नहीं करते थे। मैं रेपो में अभी तक एक और फ़ाइल जोड़ने के लिए उत्सुक नहीं था, इसलिए मैंने डेटा_फाइल्स और setup.py विकल्प - स्थापना-डेटा का लाभ उठाया; कुछ इस तरह

pip install . --install-option="--install-data=$PWD/package" -t package  

3

पैकेज डेटा को मॉड्यूल फ़ोल्डर में स्थानांतरित करने से मेरे लिए समस्या हल हो गई।

इस प्रश्न को देखें: MANIFEST.in ने "अजगर सेटअप-थ्रो इनस्टॉल" पर ध्यान नहीं दिया - कोई डेटा फ़ाइल स्थापित नहीं की गई?


3

मैं कुछ दिनों के लिए एक ही समस्या थी, लेकिन यह धागा भी मेरी मदद करने में सक्षम नहीं था क्योंकि सब कुछ भ्रमित था। इसलिए मैंने अपना शोध किया और निम्नलिखित समाधान पाया:

मूल रूप से इस मामले में, आपको करना चाहिए:

from setuptools import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_dir={'myapp':'myapp'}, # the one line where all the magic happens
   package_data={
      'myapp': ['data/*.txt'],
   },
)

पूर्ण अन्य stackoverflow यहाँ जवाब


इस की कोशिश की, लेकिन अभी भी कुछ भी नकल नहीं मिलता है।
गेरिट

3

बस लाइन को हटा दें:

include_package_data=True,

आपके सेटअप स्क्रिप्ट से, और यह ठीक काम करेगा। (अभी नवीनतम सेटप्टूल के साथ परीक्षण किया गया।)


यह पागल है, लेकिन यह दोनों के साथ काम करता है sdistऔर bdist_wheelक्या आपने इसकी जाँच की है कि क्यों?
शेजाबाल्स

1
मैं वास्तव में पुष्टि कर सकता हूं कि यह सेट होने पर sdistअनदेखा करता package_dataहै।
सैंडर स्टीफन

इस बिंदु पर कई महीने हो गए हैं, लेकिन मुझे लगता है कि कोड में चारों ओर खुदाई करना याद है, दो बार खो जाना, दस्तावेज के लिए एक उत्तम दाँत वाली कंघी लेना, और संतुष्टि प्राप्त करना। जाहिरा तौर पर विभिन्न नमूना लिपियों में यह ध्वज होता है और यह सिरदर्द का कोई अंत नहीं करता है।
इयान

1

Setup.cfg (setuptools .c 30.3.0) का उपयोग करना

30.3.0 (जारी 2016-12-08 जारी) के साथ शुरू होने पर, आप अपने setup.pyबहुत छोटे को रख सकते हैं और कॉन्फ़िगरेशन को एक setup.cfgफ़ाइल में स्थानांतरित कर सकते हैं । इस दृष्टिकोण के साथ, आप अपना पैकेज डेटा एक [options.package_data]अनुभाग में रख सकते हैं :

[options.package_data]
* = *.txt, *.rst
hello = *.msg

इस मामले में, आपका काम setup.pyजितना छोटा हो सकता है:

from setuptools import setup
setup()

अधिक जानकारी के लिए, setup.cfg फ़ाइलों का उपयोग करके सेटअप कॉन्फ़िगर करना देखें ।

नहीं है का बहिष्कार कर के कुछ बातsetup.cfg के पक्ष में pyproject.tomlके रूप में में प्रस्तावित पीईपी 518 , लेकिन यह अभी भी 2020/02/21 के रूप में अनंतिम है।


यह उत्तर मैनिफ़ेस्ट फ़ाइल का उल्लेख करने की उपेक्षा करता है, इसलिए मुझे लगता है कि यह वास्तव में sdists के साथ काम नहीं करेगा। केवल पहियों के साथ। आपको उसका उल्लेख करना चाहिए।
विम

@ मेरे पास मैनिफ़ेस्ट, sdist, और पहियों के बारे में पर्याप्त समझ नहीं है जिसका उत्तर देना है। यह मेरे लिए काम कर रहा है pip install
जेरिट

ऐसा इसलिए है pip install, क्योंकि पाइप के आधुनिक पर्याप्त संस्करणों के लिए, पहले एक पहिया का निर्माण होगा और फिर उसे स्थापित करेगा। अभी भी कई उपयोगकर्ताओं के लिए यह दृष्टिकोण चुपचाप पैकेज डेटा को शामिल करने में विफल रहेगा। उस के बारे में विवरण के लिए स्वीकृत उत्तर और उसके तहत टिप्पणियों को देखें। का उपयोग करना setup.cfgवास्तव में लिखने का एक अलग तरीका है जो ओपी पहले से ही setup.pyसवाल में ( package_dataकॉल में कीवर्ड तर्क पास करके setup) कर रहा था, इसलिए मुझे नहीं लगता कि यह इस प्रश्न के उत्तर के रूप में विशेष रूप से उपयोगी है । यह अंतर्निहित समस्या को बिल्कुल भी संबोधित नहीं कर रहा है।
विम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.