2015-09-16 11 views
8

मेरे पास python एप्लिकेशन है जिसमें एक निश्चित लेआउट है जिसे मैं नहीं बदल सकता। मैं setuptools का उपयोग करके इसे लपेटना चाहता हूं, उदा। setup.py स्क्रिप्ट लिखें।setuptools: पैकेज के बाहर अतिरिक्त फाइलें

आधिकारिक दस्तावेज़ीकरण का उपयोग करके, मैं पहला टेम्पलेट लिखने में सक्षम था। हालांकि, प्रश्न में आवेदन कई अतिरिक्त डेटा फ़ाइलों का उपयोग करता है जो स्पष्ट रूप से किसी भी पैकेज का हिस्सा नहीं हैं। यहाँ एक उदाहरण स्रोत पेड़ है:

somepackage 
    __init__.py 
    something.py 
    data.txt 
additionalstuff 
    moredata.txt 
INFO.txt 

यहाँ मुसीबत है: something.py में कोड फ़ाइलों moredata.txt और INFO.txt पढ़ता है। पूर्व के लिए, मैं पैकेज में additionalstuff को बढ़ावा देने के लिए additionalstuff/__init__.py फ़ाइल को खाली करके setuptools द्वारा उठाए गए खाली additionalstuff/__init__.py फ़ाइल को जोड़कर समस्या को बंद कर सकता हूं। लेकिन मैं संभवतः INFO.txt को अपने .egg पर कैसे जोड़ सकता हूं?

संपादित

प्रस्तावित समाधान

package_data = { '' : ['moredata.txt','INFO.txt']} 

की तर्ज पर कुछ का उपयोग कर मेरे लिए काम नहीं करता है क्योंकि फ़ाइलें moredata और INFO.txt एक पैकेज से संबंधित नहीं है, लेकिन एक अलग फ़ोल्डर का हिस्सा हैं यह पूरी तरह से मॉड्यूल का हिस्सा है, किसी भी व्यक्तिगत पैकेज के नहीं। ऊपर वर्णित अनुसार, के मामले में यह __init__.py फ़ाइल additionpythonalstuff पर जोड़कर, इसे पैकेज में प्रचारित करने के मामले में तय किया जा सकता है। हालांकि, यह एक सुरुचिपूर्ण समाधान नहीं है और यह INFO.txt के लिए बिल्कुल भी काम नहीं करता है, जो शीर्ष-स्तरीय निर्देशिका में रहता है।

समाधान

स्वीकार किए जाते हैं जवाब के आधार पर, यहाँ समाधान

है यह setup.py है:

from setuptools import setup, find_packages 

setup(
    name='mytest', 
    version='1.0.0', 
    description='A sample Python project', 
    author='Test', 
    zip_safe=False, 
    author_email='[email protected]', 
    keywords='test', 
    packages=find_packages(), 
    package_data={'': ['INFO.txt', 'moredata.txt'], 
        'somepackage':['data.txt']}, 
    data_files=[('.',['INFO.txt']), 
       ('additionalstuff',['additionalstuff/moredata.txt'])], 
    include_package_data=True, 
) 

और यह MANIFEST.in है:

include INFO.txt 
graft additionalstuff 
include somepackage/*.txt 
+1

[_stackoverflow.com/questions/1612733/including-non-python-files-with-setup-py) के संभावित डुप्लिकेट – pacholik

+1

यह डुप्लिकेट नहीं है । दिए गए प्रश्न में, स्वीकृत समाधान 'package_data' का उपयोग करना है। यह मैंने पहले ही कर लिया है। कृपया ध्यान दें कि '' '(खाली स्ट्रिंग) का उपयोग करने के लिए दिया गया समाधान मेरे लिए काम नहीं करता है क्योंकि यह स्पष्ट रूप से "सभी संकुल" को संदर्भित करता है, जो मेरे लिए लागू नहीं होता है, क्योंकि जिस फ़ाइल को मैं जोड़ना चाहता हूं वह संबंधित नहीं है * कोई * पैकेज, जो ठीक उसी समस्या का सामना कर रहा है। – carsten

उत्तर

2

वहाँ भी है data_files

data_files=[("yourdir", 
      ["additionalstuff/moredata.txt", "INFO.txt"])], 

के बारे में जहां उन फ़ाइलों को रखना चाहते हैं एक थिंक है: रूट निर्देशिका में अपने setup.py रखो, तो आप सिर्फ करने की जरूरत है। docs में अधिक जानकारी।

0

आप की जरूरत है package_data का उपयोग करें।

package_data={'': [ 
    'somepackage/*.txt', 
    'additionalstuff/*.txt', 
    '*.txt', 
] 
+1

यह प्रतिक्रिया "सभी संकुल" के संदर्भ में ''' 'की सुविधा पर निर्भर करती है। हालांकि, फ़ाइल 'INFO.txt' * किसी भी * पैकेज से संबंधित नहीं है और इस प्रकार इसे उठाया नहीं जाता है। – carsten

+0

यह मेरे लिए काम करता है। मेरे पास वही निर्देशिका निर्देशिका वृक्ष कॉन्फ़िगरेशन है जैसा आप करते हैं और मेरी प्रोजेक्ट की जड़ में मेरे पास अभी एक README.md और setup.py है। README.md को package_data का उपयोग करके सही ढंग से शामिल किया गया है। –

+0

यह मुझे आश्चर्यचकित करता है। मैंने एक छोटा टेस्टकेस बनाया है और फिर एक ही समस्या का पालन किया है। आप जो कुछ कर रहे हैं उससे आप कुछ अलग कर रहे हैं। क्या आप निर्दिष्ट परियोजना के लिए एक लिंक प्रदान कर सकते हैं ताकि मैं वास्तुकला की जांच कर सकूं? – carsten

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