MYIFEST.in "পাইথন সেটআপ.পি ইনস্টল"-এ উপেক্ষা করা হয়েছে - কোনও ডেটা ফাইল ইনস্টল করা হয়নি?


91

নন-কোড স্টাফ সহ আমার স্ট্রিপড ডাউন সেটআপ.পি স্ক্রিপ্ট এখানে রয়েছে:

#!/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

আমি যখন "পাইথন সেটআপ.পিপি ইনস্টল এসডিস্ট" চালাচ্ছি তখন আমি আমার লোকেল / চিত্রগুলি / এবং হোয়াটবোর্ড-সহায়তা / ফোল্ডারগুলি সহ "হোয়াইটবোর্ড -0.41" মূল ফোল্ডার সহ একটি দুর্দান্ত .tar.gz পাই। এটিতে আমার হোস্টবোর্ড.পি স্ক্রিপ্টও রয়েছে যা হোয়াইটবোর্ড উত্স প্যাকেজটির ভিতরে থেকে আমার প্রোগ্রামটি প্রবর্তন করে।

সুতরাং:

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

এটি আমার প্রোগ্রামের উত্সকে আয়না দেয়, সবকিছু কেমন হওয়া উচিত এবং সঠিক।

তবে আমি যখন "পাইথন সেটআপ.পিপি ইনস্টল" চালনা করি তখন আমার কোনও ডেটা ফাইল লেখা হয় না - কেবল "হোয়াইটবোর্ড" উত্স প্যাকেজ, এবং হোয়াইটবোর্ড.পি /usr/local/lib/python2.6/dist-packages/ এ রাখা হয় ।

আদর্শভাবে, আমি একই ডিরেক্টরি কাঠামোটি ডিটার-প্যাকেজগুলিতে তৈরি করার জন্য .tar.gz ফাইলটিতে যা তৈরি করা হয়েছে তা ঠিক একইভাবে চাই, যেমন আমার প্রোগ্রামটি এর উত্সগুলি সন্ধান করার প্রত্যাশা করে।

এই ডিরেক্টরি কাঠামোটি তৈরি করতে আমি কীভাবে "ইনস্টল" পেতে পারি? এটি আমার প্রকাশিত ফাইলটিকে এড়িয়ে চলেছে বলে মনে হচ্ছে যতদূর আমি বলতে পারি।


উত্তর:


30

নেডের উত্তর ছাড়াও কয়েকটি নোট (মূল সমস্যাটি হিট করে):

ডিস্ট্রিটিলস প্রতিটি প্রকল্পের উপ-ডিরেক্টরিতে site-packages(বা দেবিয়ান dist-packages/ উবুন্টু) এর মধ্যে পাইথন প্যাকেজ এবং মডিউল ইনস্টল করে না : সেগুলি সরাসরি ইনস্টল করা হয়েছে site-packages, যেমন আপনি দেখেছেন। সুতরাং whyteboard-xxআপনার এসডিস্টে অন্তর্ভুক্ত ডিরেক্টরিটি চূড়ান্ত ইনস্টল করা ফর্মটিতে উপস্থিত থাকবে না।

এর একটি নিদর্শনটি হ'ল আপনার নামটি data_filesএমনভাবে নামকরণের ক্ষেত্রে সাবধান হওয়া উচিত যাতে তারা কোন প্রকল্পের অন্তর্গত তা স্পষ্ট করে দেয় কারণ এই ফাইলগুলি / ডিরেক্টরিগুলি সরাসরি বিশ্বব্যাপী site-packagesডিরেক্টরিতে ইনস্টল করা হয় , কোনও whyteboardডিরেক্টরি থাকা ডিরেক্টরিতে নয় inside

অথবা আপনি যদি এর পরিবর্তে আপনার ডেটা বানাতে পারে package_dataএর whyteboardপ্যাকেজ (যার ফলে এটি লাইভ ভিতরে যে প্যাকেজ প্রয়োজন মানে, অর্থাত পাশে __init__.py), এবং তারপর এই একটা সমস্যা নয়।

শেষ অবধি, এটি whyteboard.pyমডিউল py_modulesএবং একটি whyteboard/__init__.pyপ্যাকেজ উভয়ই রাখলে তেমন অর্থ হয় না packages। দু'টি পারস্পরিক একচেটিয়া এবং আপনার উভয়ই থাকলে whyteboard.pyএকই নামের প্যাকেজের পক্ষে আমদানি করে মডিউলটিকে অগ্রাহ্য করা হবে।

যদি whyteboard.pyএটি কেবল একটি স্ক্রিপ্ট হয় এবং এটি আমদানির উদ্দেশ্যে না হয়, তবে আপনার এটির জন্য স্ক্রিপ্ট বিকল্প ব্যবহার করা উচিত এবং এটিকে সরিয়ে ফেলা উচিত py_modules


4
এটা দুর্ভাগ্যজনক. আমি প্যাকেজ ডেটা রাখার ধারণাটি পছন্দ করি না - আমার কাছে, এই সংস্থানগুলির উত্স ডিরেক্টরি ডিরেক্টরিের বাইরে থাকা আরও বেশি অর্থবোধ করে। এছাড়াও আমি প্রোগ্রামের নামের সাথে ডিরেক্টরি নামের পূর্বনির্ধারিত থাকতে পছন্দ করি না (যদিও সাহায্যের ফাইলগুলির জন্য আমি ইতিমধ্যে এটি করেছি)। হুম ..
স্টিভেন স্প্রোট

68

MANIFEST.inউত্স বিতরণে কোন ফাইলগুলি অন্তর্ভুক্ত করতে হবে তা ডিস্টিউটিসকে জানায় তবে কোন ফাইলগুলি ইনস্টল করা হয়েছে তা সরাসরি প্রভাবিত করে না। তার জন্য আপনাকে উপযুক্ত ফাইলগুলি setup.pyফাইলটিতে অন্তর্ভুক্ত করতে হবে, সাধারণত হয় হয় প্যাকেজ ডেটা বা অতিরিক্ত ফাইল হিসাবে ।


আমি প্যাকেজ ডেটার একটি তালিকা যুক্ত করার চেষ্টা করেছি তবে আমি নির্দিষ্ট করা ফাইলগুলির কোনওটিই ব্যবহৃত হয়নি। প্যাকেজের সামগ্রিক ইনস্টলেশন সম্পর্কিত ফাইলগুলির অবস্থানগুলি ইনস্টল করা হয়েছিল কিনা তা আমি নিশ্চিত ছিলাম না। যাইহোক, এটি এখনও আমার প্রত্যাশা করা সঠিক ডিরেক্টরি কাঠামোতে আমার ফাইলগুলি লিখেনি।
স্টিভেন স্প্রোট

এই উত্তরের সাথে লিঙ্কযুক্ত ডকুমেন্টেশন আপনাকে কোথায় ডেটা_ফাইলেস এবং প্যাকেজ_ডেটা ইনস্টল করা হবে সে সম্পর্কে আপনার সমস্ত তথ্য দেয়। যদি এই বিকল্পগুলি আপনার পক্ষে কাজ করে না, দয়া করে আপনার প্রশ্নটি ঠিক যে বাক্য গঠন করেছেন, ফলাফল এবং আপনি কী প্রত্যাশা করেছিলেন তা আপডেট করুন।
কার্ল মায়ার

4
এটি আমার জন্য কাজ করে: সেটআপ.পির ডেটা_প্যাকেজগুলিতে আমার MANIFEST.in এন্ট্রিগুলি নকল করা সমস্ত কিছুকে কাজ করে। ধন্যবাদ নেড - আমি বছরের পর বছর ধরে এই বিষয়টি বুঝতে ব্যর্থ হয়েছি। আশা করি এখন আমার ডিসটুইটগুলি / সেটআপলগুলি / বিতরণ করা অভিজ্ঞতা আরও অর্থবোধ করবে।
জোনাথন হার্টলি

7
যে প্যাকেজটি ইনস্টল হবে না এমন ফাইলগুলিকে অন্তর্ভুক্ত করতে সক্ষম হওয়ার এই নকশাটি কী বোঝায়? কখন এটি ব্যবহার করা হবে?
রজার ডাহল

29

আমি MANIFEST.inদৌড়ে যাওয়ার সময় আমার ফাইলটি কেন উপেক্ষা করা হচ্ছে তা আমি বুঝতে পারি না python setup.py install- দেখা যাচ্ছে সমস্যার include_package_data=Trueসমাধান করে। package_dataবিকল্প আসলে প্রয়োজন হয় না।


ভাল ক্যাচ, কেন include_package_data=Trueডিফল্ট মান হয় না?
লিয়াং

9

আপনার সেটআপলগুলি ব্যবহার করা উচিত:

#!/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
mlt

8

ম্যাক ওএসএক্সে অজগর ২.6.১ চালাচ্ছি , সেটআপ.পিতে ডেটা_ফায়ালস পরামিতি ব্যবহার করা ছাড়া আমার ভাগ্য ভাল ছিল না । MANIFEST.in এর সাথে সমস্ত কিছুর ফলস্বরূপ ফাইলগুলি ডিস্ট প্যাকেজটিতে অন্তর্ভুক্ত ছিল তবে কখনও ইনস্টল করা হয়নি। আমি অন্যান্য কিছু প্যাকেজ পরীক্ষা করেছিলাম এবং তারা প্রকৃতপক্ষে অতিরিক্ত ফাইলগুলি নির্দিষ্ট করতে ডেটা_ফায়ালগুলি ব্যবহার করে।

এর মধ্যে একটি ডিরেক্টরি ট্রি থেকে সমস্ত ফাইলকে গণনা করতে সহায়তা করার জন্য একটি সংক্ষিপ্ত ফাংশন তৈরি করেছি

(টার্গেট_ডির, [ফাইল তালিকা]) ফর্ম্যাট যা ডেটা_ফাইলে প্রত্যাশা করে:

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
এটি দুর্দান্ত, তবে এটি কোথায় ইনস্টল হবে? আমার জন্য, "পিপ ইনস্টল" ব্যবহার করার সময়, আমার ডেটা_ফায়ালগুলি আমার ভার্চুয়াল্নভের মূলের মধ্যে চলে যায় (অর্থাত্ সমস্ত ভার্চুয়ালেনভের প্যাকেজগুলির দ্বারা ভাগ করা একটি একক ডিরেক্টরি)) যদি "সেটআপ.পি ইনস্টল" ব্যবহার করে থাকেন, তবে আমার ডেটা ফাইলগুলি "সাইট- প্যাকেজ / <mypackage> .egg / "। যদি রানটাইমের সময় ফাইলগুলি ডেটার প্রয়োজন হয়, তবে আমার কোডের জন্য এই ফাইলগুলি সন্ধান করা উভয় ক্ষেত্রেই তুচ্ছ নয় এবং অবশ্যই রানটাইমে আমাকে উভয় ডিরেক্টরি অনুসন্ধান করতে হবে। যদি ফাইলগুলি আমার লিসেনসি ফাইল হয়, তবে তা উভয় ক্ষেত্রেই আমার ব্যবহারকারীরা আমার উত্স থেকে লিসেন্সে যাওয়ার পক্ষে তুচ্ছ নয়। বিস্মিত।
জোনাথন হার্টলি

4

ন্যূনতম প্রকাশিত চলমান উদাহরণ

কী গ্রহণযোগ্য: কেবল 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-data/ থেকে প্যাকেজটি ব্যবহার করবেন :

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='')

পাইথন_সাম্পল_প্যাকেজ_সহ_ডাটা / __ 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')

পাইথন_সাম্পল_প্যাকেজ_বিহীন_ডাটা / মাইডাটা.টেক্সট

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

গ্রন্থপঞ্জি:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.