python Setup.py के साथ गैर-पायथन फ़ाइलों सहित




distutils (6)

मैं setup.py ऐसी फ़ाइल शामिल कैसे करूं जो कोड का हिस्सा न हो? (विशेष रूप से, यह एक लाइसेंस फ़ाइल है, लेकिन यह कोई और बात हो सकती है।)

मैं फ़ाइल के स्थान को नियंत्रित करने में सक्षम होना चाहता हूं। मूल स्रोत फ़ोल्डर में, फ़ाइल पैकेज की जड़ में है। (यानी शीर्ष स्तर के समान स्तर पर __init__.py ।) मैं ऑपरेटिंग सिस्टम की परवाह किए बिना पैकेज स्थापित होने पर बिल्कुल वहां रहना चाहता हूं। मैं उसको कैसे करू?


परियोजना रूट में MANIFEST.in को recursive-include साथ recursive-include आवश्यक निर्देशिका include या फ़ाइल नाम के साथ include करें।

include LICENSE
include README.rst
recursive-include package/static *
recursive-include package/templates *

दस्तावेज यहां पाया जा सकता है


जो कुछ आप वर्णन कर रहे हैं उसे पूरा करने के लिए दो कदम उठाएंगे ...

  • फ़ाइल को स्रोत टैरबॉल में जोड़ा जाना चाहिए
  • स्रोत पथ में डेटा फ़ाइल को स्थापित करने के लिए setup.py को संशोधित करने की आवश्यकता है

चरण 1: फ़ाइल को स्रोत टैरबॉल में जोड़ने के लिए, इसे MANIFEST में शामिल करें

फ़ोल्डर में एक मैनिफ़ेस्ट टेम्पलेट बनाएं जिसमें setup.py शामिल है

मैनिफ़ेस्ट मूल रूप से उन सभी फ़ाइलों की एक सूची वाली एक टेक्स्ट फ़ाइल है जिसे स्रोत टैरबॉल में शामिल किया जाएगा।

यहां मेरी परियोजना के लिए मैनिफ़ेस्ट जैसा दिखता है:

  • changelog.txt
  • install.txt
  • license.txt
  • pypreprocessor.py
  • README.txt
  • setup.py
  • test.py
  • TODO.txt

नोट: जबकि एसडीआईटी स्वचालित रूप से कुछ फाइलें जोड़ता है , मैं स्पष्ट रूप से यह सुनिश्चित करने के लिए निर्दिष्ट करता हूं कि यह सुनिश्चित करने के बजाय कि यह क्या करता है और नहीं करता है।

चरण 2: स्रोत फ़ाइल में डेटा फ़ाइल स्थापित करने के लिए setup.py को संशोधित करें

चूंकि आप स्रोत इंस्टॉल फ़ोल्डर में डेटा फ़ाइल (LICENSE.txt) जोड़ना चाहते हैं, इसलिए आपको स्रोत इंस्टॉल पथ से मेल खाने के लिए डेटा इंस्टॉल पथ को संशोधित करने की आवश्यकता है। यह आवश्यक है क्योंकि, डिफ़ॉल्ट रूप से, डेटा फ़ाइलों को स्रोत फ़ाइलों की तुलना में किसी भिन्न स्थान पर स्थापित किया जाता है।

स्रोत स्थापित dir से मेल खाने के लिए डेटा स्थापित dir को संशोधित करने के लिए ...

Distirils से स्थापित डीआईआर जानकारी खींचें:

from distutils.command.install import INSTALL_SCHEMES

स्रोत स्थापित dir से मेल खाने के लिए डेटा इंस्टॉल dir को संशोधित करें:

for scheme in INSTALL_SCHEMES.values():
    scheme['data'] = scheme['purelib']

और, सेटअप करने के लिए डेटा फ़ाइल और स्थान जोड़ें ():

data_files=[('', ['LICENSE.txt'])]

नोट: उपरोक्त चरणों को किसी भी विस्तारित पुस्तकालयों की आवश्यकता के बिना मानक तरीके से वर्णित सटीक रूप से पूरा करना चाहिए।


ऐसा करने का शायद सबसे अच्छा तरीका setuptools package_data निर्देश का उपयोग करना है। इसका मतलब setuptools बजाय setuptools (या distribute ) का distutils , लेकिन यह एक बहुत ही निर्बाध "अपग्रेड" है।

यहां एक पूर्ण (लेकिन अवांछित) उदाहरण है:

from setuptools import setup, find_packages

setup(
    name='your_project_name',
    version='0.1',
    description='A description.',
    packages=find_packages(exclude=['ez_setup', 'tests', 'tests.*']),
    package_data={'': ['license.txt']},
    include_package_data=True,
    install_requires=[],
)

यहां दी गई विशिष्ट रेखाओं पर ध्यान दें:

package_data={'': ['license.txt']},
include_package_data=True,

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

package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}

यहां समाधान निश्चित रूप से एक .py एक्सटेंशन के साथ आपकी गैर- py फ़ाइलों का नाम बदलने के लिए नहीं है।

अधिक जानकारी के लिए इयान Bicking की प्रस्तुति देखें।

अद्यतन: एक और [बेहतर] दृष्टिकोण

एक और दृष्टिकोण जो अच्छी तरह से काम करता है अगर आप केवल स्रोत वितरण ( sdist ) की सामग्री को नियंत्रित करना चाहते हैं और पैकेज के बाहर फाइलें हैं (जैसे शीर्ष-स्तरीय निर्देशिका) MANIFEST.in फ़ाइल जोड़ना है। इस फ़ाइल के प्रारूप के लिए पायथन दस्तावेज़ देखें।

इस प्रतिक्रिया को लिखने के बाद से, मैंने पाया है कि MANIFEST.in का उपयोग करना आम तौर पर यह सुनिश्चित करने के लिए एक कम निराशाजनक दृष्टिकोण है कि आपके स्रोत वितरण ( tar.gz ) में आपकी आवश्यक फ़ाइलें हैं।

उदाहरण के लिए, यदि आप शीर्ष-स्तर से require.txt को शामिल करना चाहते हैं, तो क्रमशः शीर्ष-स्तर "डेटा" निर्देशिका शामिल करें:

include requirements.txt
recursive-include data *

फिर भी, इन फ़ाइलों को साइट-पैकेज के अंदर पैकेज के फ़ोल्डर में इंस्टॉल समय पर प्रतिलिपि बनाने के लिए, आपको include_package_data=True setup() फ़ंक्शन के लिए include_package_data=True आपूर्ति करने की आवश्यकता होगी। अधिक जानकारी के लिए गैर-कोड फ़ाइलें जोड़ना देखें।


एक वर्कअराउंड का पता लगाया: मैंने अपना lgpl2.1_license.txt को lgpl2.1_license.txt.py बदल दिया, और टेक्स्ट के चारों ओर कुछ ट्रिपल उद्धरण डाले। अब मुझे data_files विकल्प का उपयोग करने की आवश्यकता नहीं है और न ही किसी भी पूर्ण पथ को निर्दिष्ट करने की आवश्यकता है। इसे एक पाइथन मॉड्यूल बनाना बदसूरत है, मुझे पता है, लेकिन मैं इसे पूर्ण पथ निर्दिष्ट करने से कम बदसूरत मानता हूं।


Setup.py में सेटअप के तहत (:

setup(
   name = 'foo library'
   ...
  package_data={
   'foolibrary.folderA': ['*'],     # All files from folder A
   'foolibrary.folderB': ['*.txt']  #All text files from folder B
   },

यहां एक आसान जवाब है जो मेरे लिए काम करता है।

सबसे पहले, ऊपर एक पायथन देव की टिप्पणी के अनुसार, setuptools की आवश्यकता नहीं है:

package_data is also available to pure distutils setup scripts 
since 2.3. – Éric Araujo

यह बहुत अच्छा है क्योंकि आपके पैकेज पर setuptools आवश्यकता डालने का मतलब है कि आपको इसे भी इंस्टॉल करना होगा। संक्षेप में:

from distutils.core import setup

setup(
    # ...snip...
    packages          = ['pkgname'],
    package_data      = {'pkgname': ['license.txt']},
)




distutils