python Setuptools/वितरण के साथ पैकेज डेटा कैसे शामिल करें?




distribute (7)

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

यह प्रश्न देखें: MANIFEST.in ने "python setup.py install" पर अनदेखा किया - कोई डेटा फाइल स्थापित नहीं है?

https://code.i-harness.com

Setuptools / वितरण का उपयोग करते समय, मैं किसी भी 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/ डेटा फ़ाइलों का स्थान है।


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

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

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

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


मुझे बस यही समस्या थी। समाधान, include_package_data=True को हटाने के लिए था।

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

डेटा फ़ाइलों [include_package_data] का सीवीएस या सबवर्जन नियंत्रण के तहत होना चाहिए

...

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

उस तर्क को ठीक करने से इसे ठीक कर दिया गया है, जो संयोग से है जब आपने distutils पर स्विच किया, यह भी काम क्यों किया, क्योंकि यह उस तर्क को नहीं लेता है।


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

थोड़ा और विस्तार करने के लिए, मेरे पास कोई 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...
        ], },
)

मैं एक स्रोत distrib के लिए 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 इंस्टॉल किया जाता है।


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

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

(मैंने जो टिप्पणी बनाई, उसे चिपकाया, क्योंकि के k3-rnc ने उल्लेख किया कि यह वास्तव में सहायक है)


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

मैंने इसे दूर करने के लिए स्विच करके हल किया। ऐसा लगता है कि वितरित बहिष्कृत और / या टूटा हुआ है।

from distutils.core import setup

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




distribute