2009-10-23 16 views
108

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

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

+0

आप कैसे करते हो कि इस समय? आपका पिछला प्रश्न इंगित करता है कि आप लाइसेंस फ़ाइल को जोड़ने के तरीके से परिचित हैं, तो आपका कोड क्या है जो "काम नहीं करता"? – SilentGhost

+1

'data_files = [('', ['lgpl2.1_license.txt',]),] 'इसे पायथन 26 फ़ोल्डर में रखता है। –

+0

कुछ नकारात्मक प्रतिक्रिया के बाद, मैंने फिर से आपका प्रश्न पढ़ा और महसूस किया कि मैं क्या खो रहा था। मैंने आपके प्रश्न को एक गैर-हैकिश समाधान प्रदान करने के लिए अपना उत्तर अपडेट किया है जिसके लिए किसी भी अतिरिक्त मॉड्यूल (जैसे setuptools या वितरित) की आवश्यकता नहीं है। –

उत्तर

122

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

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 पैकेज के नाम का एक dict है (खाली = सभी संकुल)

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

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

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

अधिक जानकारी के लिए Ian Bicking's presentation देखें।

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

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

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

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

include requirements.txt 
recursive-include data * 

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

+0

इयान की प्रस्तुति का लिंक टूटा हुआ है :( –

+0

अपडेटेड प्रेजेंटेशन लिंक - धन्यवाद! –

+5

पैकेज_डाटा पाइथन 2.3 के बाद शुद्ध डिस्ट्यूट्स सेटअप स्क्रिप्ट के लिए भी उपलब्ध है। –

-13

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

+6

मेरी पोस्ट देखें। यह बदसूरत नहीं होना चाहिए। नेट पर एक अच्छा उदाहरण ढूंढना मुश्किल है क्योंकि संकुल को सेटअप करने के लिए अच्छा दस्तावेज ढूंढना मुश्किल है। –

34

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

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

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

में शामिल है कि setup.py

वाले फ़ोल्डर में एक MANIFEST टेम्पलेट बनाएँ 0

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

यहाँ अपने प्रोजेक्ट के लिए MANIFEST की तरह लग रही है:

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

नोट: हालांकि sdist does add some files automatically, मैं स्पष्ट रूप से उन्हें बजाय भविष्यवाणी यह ​​क्या करता है और नहीं है के बारे में सुनिश्चित होने के लिए निर्दिष्ट करने के लिए पसंद करते हैं।

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

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

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

साथ distutils से dir जानकारी स्थापित खींचो:

from distutils.command.install import INSTALL_SCHEMES 

डेटा स्रोत dir स्थापित मैच के लिए dir स्थापित संशोधित :

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

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

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

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

+4

मैनिफ़ेस्ट केवल स्रोत टैरबॉल (एसडीआईस्ट द्वारा उत्पादित) में शामिल फ़ाइलों को नियंत्रित करता है। सूचीबद्ध फाइलें स्थापित नहीं की जाएंगी। –

+0

@ डेविड मुझे नहीं पता था कि मैं अपने पहले दृष्टिकोण में कितना दूर था। मैंने किसी भी अतिरिक्त तृतीय-पक्ष पुस्तकालयों की आवश्यकता के बिना प्रश्न पूछने के लिए सही होने का उत्तर अपडेट किया है। –

+0

मैं इंस्टॉल योजनाओं को मैन्युअल रूप से एक बहुत बुरा विचार संपादित करने पर विचार करता हूं। –

3

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

सबसे पहले, ऊपर एक अजगर देव की टिप्पणी प्रति, 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']}, 
) 
+0

यह निर्देशिका की शिकायत करेगा 'pkgame' मौजूद नहीं है –

4

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

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

मैं सिर्फ मैं package_data या data_files जोड़ना Centos 6. पर पायथन 2.7 के साथ काम कर पाया कुछ पर पालन करने के रूप में उल्लेख करना चाहता था ऊपर मेरे लिए काम नहीं किया। मैंने उन फ़ाइलों के साथ एक MANIFEST.IN जोड़ा जो मैं चाहता था कि गैर-पायथन फ़ाइलों को टैरबॉल में रखा जाए, लेकिन उन्हें आरपीएम के माध्यम से लक्ष्य मशीन पर स्थापित नहीं किया गया।

अंत में, मैं सेटअप/setuptool में "विकल्प" का उपयोग कर फ़ाइलों को मेरे समाधान में प्राप्त करने में सक्षम था रों। विकल्प फ़ाइलें आपको setup.py से spec फ़ाइल के विभिन्न अनुभागों को संशोधित करने देती हैं। निम्नलिखित नुसार।

from setuptools import setup 


setup(
    name='theProjectName', 
    version='1', 
    packages=['thePackage'], 
    url='', 
    license='', 
    author='me', 
    author_email='[email protected]', 
    description='', 
    options={'bdist_rpm': {'install_script': 'filewithinstallcommands'}}, 
) 

फ़ाइल - MANIFEST.in:

include license.txt 

फ़ाइल - filewithinstallcommands:

mkdir -p $RPM_BUILD_ROOT/pathtoinstall/ 
#this line installs your python files 
python setup.py install -O1 --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES 
#install license.txt into /pathtoinstall folder 
install -m 700 license.txt $RPM_BUILD_ROOT/pathtoinstall/ 
echo /pathtoinstall/license.txt >> INSTALLED_FILES 
1

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

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

documentation can be found here

संबंधित मुद्दे