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




build distutils (4)

गैर-कोड सामग्री हटाए जाने के साथ यहां मेरी छीनी-नीचे की सेटअप-स्क्रिप्ट है:

#!/usr/bin/env python

from distutils.core import setup
from whyteboard.misc import meta


setup(
    name = 'Whyteboard',
    version = meta.version,

    packages = ['whyteboard', 'whyteboard.gui', 'whyteboard.lib', 'whyteboard.lib.pubsub',
                'whyteboard.lib.pubsub.core', 'whyteboard.lib.pubsub.utils', 'whyteboard.misc'],

    py_modules = ['whyteboard'],
    scripts = ['whyteboard.py'],
)

MANIFEST.in:

include *.txt
include whyteboard-help/*.*
recursive-include locale *.mo
recursive-include images *.png

जब मैं "python setup.py स्थापित sdist" चलाता हूं, तो मुझे एक "Whyteboard-0.41" रूट फ़ोल्डर के साथ एक अच्छा .tar.gz मिलता है, जिसमें मेरे लोकेल / चित्र / और Whyteboard-help / फ़ोल्डर्स होते हैं। इसमें मेरी Whyteboard.py स्क्रिप्ट भी है जो Whyteboard स्रोत पैकेज के अंदर से मेरा प्रोग्राम लॉन्च करती है।

इसलिए:

whyteboard/
 ├── locale/
 ├── images
 ├── whyteboard-help/
 ├── whyteboard/
   ├── __init__.py
   └── other packages etc
 ├── whyteboard.py
 ├── README
 ├── setup.py
 └── CHANGELOG

यह मेरे कार्यक्रम के स्रोत को दर्शाता है, यह है कि सब कुछ कैसे होना चाहिए, और सही है।

हालाँकि जब मैं "python setup.py स्थापित" चलाता हूं, तो मेरी कोई भी डेटा फ़ाइल नहीं लिखी जाती - केवल "Whyteboard" स्रोत पैकेज, और Whyteboard.py को /usr/local/lib/python2.6/nist-packages/ में रखा जाता है ।

आदर्श रूप में, मैं वही निर्देशिका संरचना पसंद करता हूं, जो .tar.gz फ़ाइल में जनरेट की गई है, जिसे डिस्ट-पैकेज में बनाया जाना है, क्योंकि इस तरह से मेरा प्रोग्राम अपने संसाधनों की तलाश करता है।

मैं इस निर्देशिका संरचना को बनाने के लिए "इंस्टॉल" कैसे कर सकता हूं? यह मेरी प्रकट फ़ाइल को अनदेखा कर रहा है, जहाँ तक मैं बता सकता हूँ।


मैं यह पता नहीं लगा सका कि जब मेरे द्वारा python setup.py install किया गया था, तो मेरे MANIFEST.in फ़ाइल को अनदेखा क्यों किया जा रहा था - इसमें शामिल include_package_data=True समस्या का हल करता है। package_data विकल्प वास्तव में आवश्यक नहीं है।


मैक OSX पर अजगर 2.6.1 चल रहा है, मुझे setup.py में data_files पैरामीटर का उपयोग करने के अलावा बिल्कुल कोई भाग्य नहीं था। MANIFEST.in के साथ सब कुछ बस फाइलों में गड़बड़ी पैकेज में शामिल किया गया था, लेकिन कभी भी स्थापित नहीं हुआ। मैंने कुछ अन्य पैकेजों की जाँच की और वे अतिरिक्त फ़ाइलों को निर्दिष्ट करने के लिए वास्तव में data_files का उपयोग कर रहे थे।

मैंने एक डायरेक्टरी ट्री से सभी फाइलों को इन्युमरेट करने में मदद करने के लिए एक छोटा फंक्शन बनाया

(target_dir, [file list]) प्रारूप जो data_files को उम्मीद है:

def gen_data_files(*dirs):
    results = []

    for src_dir in dirs:
        for root,dirs,files in os.walk(src_dir):
            results.append((root, map(lambda f:root + "/" + f, files)))
    return results

अब मैं इसे अपने सेटअप कॉल के अंदर कॉल कर सकता हूं:

setup(... data_files = gen_data_files("docs", "lib") ...

और उन पेड़ों में सब कुछ स्थापित हो जाता है।


आपको सेटप्टूल का उपयोग करना चाहिए:

#!/usr/bin/env python

from setuptools import setup, find_packages
from whyteboard.misc import meta


setup(
  name = 'Whyteboard',
  version = meta.version,

  packages = find_packages(),
  include_package_data=True,

  py_modules = ['whyteboard'],
  scripts = ['whyteboard.py'],
)

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


नेड के उत्तर के अलावा कुछ नोट्स (जो मुख्य समस्या पर हिट करते हैं):

डिस्टिल्स site-packages (या डेबियन / उबंटू पर dist-packages ) के भीतर प्रति-प्रोजेक्ट उपनिर्देशिका के अंदर पायथन पैकेज और मॉड्यूल स्थापित नहीं करते हैं: वे सीधे site-packages में स्थापित होते हैं, जैसा आपने देखा है। तो आपके sdist में whyteboard-xx निर्देशिका अंतिम स्थापित रूप में मौजूद नहीं होगी।

इसका एक निहितार्थ यह है कि आपको अपने data_files को इस तरह से नाम देने के लिए सावधान रहना चाहिए जो यह स्पष्ट करता है कि वे किस परियोजना से संबंधित हैं, क्योंकि वे फाइलें / निर्देशिका सीधे वैश्विक site-packages निर्देशिका में स्थापित की जाती हैं, न कि whyteboard निर्देशिका के अंदर।

या आप इसके बजाय whyteboard पैकेज के अपने डेटा package_data बना सकते हैं (जिसका अर्थ है कि उस पैकेज के अंदर रहने की जरूरत है, यानी __init__.py बगल में), और फिर यह कोई समस्या नहीं है।

अंत में, यह whyteboard.py में एक whyteboard.py मॉड्यूल और पैकेज में whyteboard/__init__.py पैकेज दोनों का बहुत मतलब नहीं packages । दोनों परस्पर अनन्य हैं, और यदि आपके पास दोनों हैं, तो whyteboard.py मॉड्यूल को उसी नाम के पैकेज के पक्ष में आयात द्वारा अनदेखा किया जाएगा।

यदि whyteboard.py सिर्फ एक स्क्रिप्ट है, और इसका आयात करने का इरादा नहीं है, तो आपको इसके लिए scripts विकल्प का उपयोग करना चाहिए, और इसे py_modules से हटा py_modules





distutils