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


89

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

#!/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 install" चलाता हूं, तो मेरी कोई भी डेटा फ़ाइल नहीं लिखी जाती है - केवल "Whyteboard" स्रोत पैकेज, और Whyteboard.py को /usr/local/lib/python2.6/nist-packages/ में रखा जाता है ।

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

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


जवाबों:


30

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

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

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

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

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

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


1
बदकिस्मती से। मुझे पैकेज डेटा होने का विचार पसंद नहीं है - मेरे लिए, यह उन संसाधनों के लिए स्रोत निर्देशिका से बाहर रहने के लिए अधिक समझ में आता है। न ही मुझे प्रोग्राम के नाम के साथ उपसर्गित निर्देशिका नाम रखना पसंद है (भले ही मैं मदद फ़ाइलों के लिए पहले से ही ऐसा करता हूं)। हम्म ..
स्टीवन स्‍पॉट

67

MANIFEST.inडिस्ट्रीब्यूट्स को बताता है कि सोर्स डिस्ट्रीब्यूशन में किन फाइल्स को शामिल करना है लेकिन यह उन फाइलों को सीधे तौर पर प्रभावित नहीं करता है जो इनस्टॉल हैं। उसके लिए आपको setup.pyफ़ाइल में उपयुक्त फ़ाइलों को शामिल करना होगा , आमतौर पर या तो पैकेज डेटा के रूप में या अतिरिक्त फ़ाइलों के रूप में ।


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

इस उत्तर में लिंक किया गया दस्तावेज़ आपको वह सारी जानकारी देता है जिसकी आपको ज़रूरत है जहाँ data_files और package_data स्थापित हैं। यदि ये विकल्प आपके लिए काम नहीं कर रहे हैं, तो कृपया अपने प्रश्न को आपके द्वारा किए गए सटीक सिंटैक्स, परिणामों और आपके द्वारा अपेक्षित के साथ अपडेट करें।
कार्ल मेयर

4
यह मेरे लिए काम करता है: setup.py के data_packages के अंदर मेरे MANIFEST.in प्रविष्टियों को डुप्लिकेट करने से सब कुछ काम हो जाता है। धन्यवाद नेड - मैं वर्षों से इस बिंदु को समझने में विफल रहा हूं। उम्मीद है कि अब मेरे डिस्टुटिल्स / सेटपूल / डिस्ट्रीब्यूटर्स एक्सपीरियंस को और बेहतर बना देंगे
जोनाथन हार्टले

7
क्या यह डिज़ाइन पैकेज में उन फ़ाइलों को शामिल करने में सक्षम है जो स्थापित करने से कोई मतलब नहीं होगा? इसका उपयोग कब किया जाएगा?
रोजर डाहल

27

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


अच्छी पकड़, include_package_data=Trueडिफ़ॉल्ट मूल्य क्यों नहीं है?
लियांग

8

मैक 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") ...

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


11
यह बहुत अच्छा है, लेकिन यह कहां स्थापित होता है? मेरे लिए, "पाइप इंस्टॉल" का उपयोग करते समय, मेरा data_files मेरे virtualenv (यानी सभी virtualenv के पैकेजों द्वारा साझा की गई एकल निर्देशिका) की जड़ में जाता है। यदि "setup.py इंस्टॉल" का उपयोग किया जाता है, तो मेरा data_files "साइट-" पर जाता है। संकुल / <mypackage> .egg / "। यदि फ़ाइलों को रनटाइम पर डेटा की आवश्यकता होती है, तो न तो मामले में इन फ़ाइलों को खोजने के लिए मेरे कोड के लिए तुच्छ है, और निश्चित रूप से मुझे रनटाइम पर दोनों निर्देशिकाओं को खोजना होगा। यदि फ़ाइलें मेरी LICENSE फ़ाइल हैं, तो न तो मामले में यह मेरे उपयोगकर्ताओं के लिए मेरे स्रोत से LENENSE के लिए तुच्छ है। हैरान।
जोनाथन हार्टले

8

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

#!/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'],
)

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


इसने मेरे लिए सेटटॉप्स के साथ काम किया । मैं डेबियन पैकेज का निर्माण करता हूं और मुझे package_dataशब्दकोश में सूचीबद्ध मेरी ग्लेड फाइलें दिखाई देती हैं, जो मैंने जोड़े जाने के बाद ही सही जगह दिखाई include_package_data=Tru
जूल 11'13

3

न्यूनतम प्रकाशित किया गया उदाहरण

मुख्य टेकअवे: केवल MANIFEST.inमेरे लिए काम किया, package_dataनहीं किया।

उबंटू 19.10, पायथन 3.7.5, पहिया == 0.32.3, सेटप्टूल = = 41.1.0, सुतली == 3.1.1 पर परीक्षण किया गया।

अंतिम उपयोगकर्ता https://pypi.org/project/python-sample-package-with-bata/ से पैकेज का उपयोग कैसे करते हैं :

python3 -m pip install --user python-sample-package-with-data
python-sample-package-with-data

अपेक्षित उत्पादन:

hello data

कैसे बनाए रखने वाले इसे प्रकाशित करते हैं:

# One time setup.
python3 -m pip install --user setuptools wheel twine

# Every time you want to publish.
python setup.py sdist bdist_wheel
twine upload dist/*
rm -rf build dist *.egg-info

वास्तविक फाइलें:

MANIFEST.in

# Or else pip install cannot find README.md on the setup.py under certain conditions.
include README.md

# This actually adds the data file.
include python_sample_package_with_data/mydata.txt

अजगर नमूना पैकेज-साथ-डेटा

#!/usr/bin/env python3

import python_sample_package_with_data

print(python_sample_package_with_data.get_data(), end='')

python_sample_package_with_data / __ init__.py

try:
    import importlib.resources as importlib_resources
except ImportError:
    # In PY<3.7 fall-back to backported `importlib_resources`.
    import importlib_resources

def get_data():
    return importlib_resources.read_text(__name__, 'mydata.txt')

python_sample_package_with_data / mydata.txt

hello data

setup.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from setuptools import setup, find_packages

from os import path
this_directory = path.abspath(path.dirname(__file__))
with open(path.join(this_directory, 'README.md')) as f:
    long_description = f.read()

setup(
    name='python-sample-package-with-data',
    version='0.0.3',
    description='My short description',
    long_description=long_description,
    long_description_content_type='text/markdown',
    url='https://github.com/cirosantilli/python-sample-package-with-data',
    author='Ciro Santilli',
    author_email='ciro.santilli.contact@gmail.com',
    packages=find_packages(),
    include_package_data=True,
    scripts=['python-sample-package-with-data'],
)

ग्रंथ सूची:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.