কীভাবে সেটআপলগুলি / বিতরণ সহ প্যাকেজ ডেটা অন্তর্ভুক্ত করবেন?


135

সেটআপলগুলি / বিতরণ করার সময়, আমি কোনও package_dataফাইল আনার জন্য ইনস্টলারটি পেতে পারি না । আমি যা কিছু পড়েছি তা বলে যে নীচেরটি এটি করার সঠিক উপায়। কেউ দয়া করে পরামর্শ দিতে পারেন?

setup(
   name='myapp',
   packages=find_packages(),
   package_data={
      'myapp': ['data/*.txt'],
   },
   include_package_data=True,
   zip_safe=False,
   install_requires=['distribute'],
)

myapp/data/ডেটা ফাইলের অবস্থান কোথায় ।


2
আমার একই সমস্যা হচ্ছে ... ম্যানুয়ালি সমস্যা সমাধানের বিষয়টি উল্লেখ data_filesকরে। তবে এটি ত্রুটিযুক্ত এবং আমার কাছে "সঠিক বোধ করে না"। কেউ যাচাই করতে পারেন যে এটা সত্যিই হয় প্রয়োজনীয় উভয় কনফিগারেশন অনুরূপ package_dataএবং data_files?
এক্সহুমা

github.com/wimglenn/resources-example একটি আধুনিক সেটআপলগুলি প্রকল্প কাঠামো দেখায়, যা সঠিকভাবে ব্যবহার করে চাকা এবং এসডিস্টগুলিতে ডেটা ফাইলগুলি প্যাকেজ করতে পারে pyproject.toml। কোনও setup.pyফাইলের প্রয়োজন নেই।
wim

উত্তর:


289

আমি বুঝতে পারি যে এটি একটি পুরানো প্রশ্ন, তবে গুগলের মাধ্যমে লোকেরা এখানে পথ খুঁজে নিচ্ছে: package_dataএটি নিম্ন-ডাউন, নোংরা মিথ্যা । এটা শুধুমাত্র যখন বিল্ডিং ব্যবহার করা হয় বাইনারি (প্যাকেজ python setup.py bdist ...) কিন্তু না যখন উৎস প্যাকেজ বিল্ডিং ( python setup.py sdist ...)। এটি অবশ্যই হাস্যকর - কেউ আশা করতে পারে যে উত্স বিতরণ তৈরির ফলে ফাইলগুলির সংকলনের ফলস্বরূপ বাইনারি বিতরণ তৈরির জন্য অন্য কাউকে পাঠানো যেতে পারে।

যে কোনও ক্ষেত্রে, বাইনারি এবং উত্স বিতরণের জন্য উভয়ইMANIFEST.in কাজ করবে ।


97
আমি গত এক ঘন্টা ধরে এই সমস্যাটি নিয়ে গবেষণা করছি এবং অনেকগুলি পদ্ধতির চেষ্টা করছি। যেমন আপনি বলেছেন, package_dataকাজ করে bdistএবং না sdistতবে , MANIFEST.inকাজ করে sdist, কিন্তু জন্য নাbdist ! অতএব, শ্রেষ্ঠ আমি সঙ্গে আসা পর্যন্ত করতে সমর্থ হয়েছেন উভয় অন্তর্ভুক্ত করা হয় package_dataএবং MANIFEST.inঅর্ডার উভয় মিটমাট করার জন্য bdistএবং sdist
ওয়েসলি বাগ

7
@ ওয়েসলিবাগকে সমর্থন করার জন্য আমি আরও একটিকে পেয়েছি। স্ট্যাকওভারফ্লো . com / a / 2969087 / 261718 এ , MANIFEST.inআপনি যে ফাইলগুলি ইনস্টল করবেন না তার জন্য ব্যবহার করুন , যেমন ডকুমেন্টেশন, এবং package_dataযে ফাইলগুলি ব্যবহার করেন যা পাইথন কোড নয় (যেমন কোনও চিত্র বা টেম্পলেট)।
ড্র গুয়ান

12
আমি sdist ব্যবহার করছি, এবং উভয় MANIFEST.in এবং অন্তর্ভুক্ত ছিল package_data। দেখে মনে MANIFEST.inহয় বিতরণে অন্তর্ভুক্ত থাকা বিষয়গুলি নিয়ন্ত্রণ করে এবং প্যাকেজ_ডেটা ইনস্টল করার সময় সাইট_প্যাকেজ ডায়ারে পরবর্তীকালে কী অনুলিপি হয়ে যায় তা নিয়ন্ত্রণ করে। বিভ্রান্তিকরভাবে, পাথগুলি MANIFEST.inসেটআপ.পি এর অবস্থানের package_dataসাথে সম্পর্কিত এবং পৃথক প্যাকেজগুলির (যেমন মডিউল) মূলের সাথে সম্পর্কিত।
এডওয়ার্ড নেওয়েল

9
"সংস্করণ ২.7 এ পরিবর্তিত হয়েছে: প্যাকেজ_ডাটার সাথে মেলে সমস্ত ফাইল ম্যানিফয়েস্ট ফাইলটিতে যোগ করা হবে যদি কোনও টেমপ্লেট না দেওয়া থাকে। বিতরণ করার জন্য ফাইলগুলি নির্দিষ্ট করে দেখুন" " distutils থেকে । সুতরাং, আপনি কেবলমাত্র জিপের মধ্যে package_dataস্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত হওয়ার সাথে সাথে ফাইলগুলির আচরণ দেখতে পাবেন যদি আপনার কাছে বিদ্যমান কোন ম্যানিফাইএসটি.ইন ফাইল নেই এবং আপনি কেবল ২.7+ ব্যবহার করছেন using
জন

29
সিরিয়াসলি, আমার কাছে মনে হচ্ছে এই টিকিটটি লোকেরা সেটআপটুলগুলি ব্যবহার করে এবং তারা নিজের জীবনে কী ভয়াবহ জায়গা খুঁজে পেয়েছে তা আবিষ্কার করার জন্য একটি গ্রুপ থেরাপি সেশন।
ম্যাট জয়েস

32

আমি ঠিক এই একই সমস্যা ছিল। সমাধান, সরানো ছিল সহজভাবে include_package_data=True

এখানে পড়ার পরে , আমি বুঝতে পেরেছি যে নামটি বোঝা যাচ্ছে কেবল "প্যাকেজ ডেটা অন্তর্ভুক্ত" এর বিপরীতে সংস্করণ নিয়ন্ত্রণinclude_package_data থেকে ফাইলগুলি অন্তর্ভুক্ত করা । ডক্স থেকে:

[অন্তর্ভুক্ত_প্যাকেজ_ডেটার] ডেটা ফাইলগুলি অবশ্যই সিভিএস বা সাবভার্সন নিয়ন্ত্রণের অধীনে থাকতে হবে

...

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

এই যুক্তিটি গ্রহণ করা এটি স্থির করে দিয়েছিল, এটি কাকতালীয় কারণ কেন যখন আপনি বিতর্কিত দিকে স্যুইচ করেন তখন এটি কাজ করেছিল, কারণ এটি তর্কটি গ্রহণ করে না।


2
আমার অভিজ্ঞতা পার্থক্য করে, include_package_data=Trueএন্ট্রিটি অন্তর্ভুক্ত না করে আমারও একই সমস্যা ছিল । আমার জন্য কেবল সমাধানটি হ'ল উপরের পরামর্শ অনুসারে ম্যানিফেস্টে একটি এন্ট্রি যুক্ত করা। মনে মনে আমি সেটআপলগুলি ব্যবহার করছিলাম, সম্ভবত আপনার সংস্করণটি 'বিতরণ' দিয়ে কাজ করে?
টিমস্টলে

4
include_package_dataসমস্যা সমাধানের অপসারণের আসল কারণটি মূল পাঠ্যে আরও রয়েছে - যদি সেটআপলগুলি-নির্দিষ্ট include_package_dataযুক্তি ব্যবহার করা হয় তবে নির্দিষ্ট করা ফাইলগুলি ফাইলটিতে package_dataতালিকাভুক্ত না করা থাকলে স্বয়ংক্রিয়ভাবে ম্যানিফেস্টে যুক্ত হবে না MANIFEST.in
পাইওটর ডব্রোগস্ট

package_dataএকটি খালি শূন্য তালিকায় সেট করে নির্দিষ্ট করে দেওয়ার ক্ষেত্রে কী কী ব্যবহার হয় include_package_data=False? আর কেনই বা আপনি দুইবার ফাইল উল্লেখ করতে হবে MANIFEST.inএবং package_data?
হার্বার্ট

21

include_package_data=Trueলাইনটি সরানোর জন্য @ জো-র সুপারিশ অনুসরণ করাও আমার পক্ষে কাজ করেছিল।

আরও কিছুটা ব্যাখ্যা করতে গেলে আমার কাছে কোনও MANIFEST.in ফাইল নেই। আমি সিভিএস নয়, গিট ব্যবহার করি।

সংগ্রহস্থল এই ধরণের আকার নেয়:

/myrepo
    - .git/
    - setup.py
    - myproject
        - __init__.py
        - some_mod
            - __init__.py
            - animals.py
            - rocks.py
        - config
            - __init__.py
            - settings.py
            - other_settings.special
            - cool.huh
            - other_settings.xml
        - words
            - __init__.py
            word_set.txt

setup.py:

from setuptools import setup, find_packages
import os.path

setup (
    name='myproject',
    version = "4.19",
    packages = find_packages(),  
    # package_dir={'mypkg': 'src/mypkg'},  # didnt use this.
    package_data = {
        # If any package contains *.txt or *.rst files, include them:
        '': ['*.txt', '*.xml', '*.special', '*.huh'],
    },

#
    # Oddly enough, include_package_data=True prevented package_data from working.
    # include_package_data=True, # Commented out.
    data_files=[
#               ('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
        ('/opt/local/myproject/etc', ['myproject/config/settings.py', 'myproject/config/other_settings.special']),
        ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'cool.huh')]),
#
        ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'other_settings.xml')]),
        ('/opt/local/myproject/data', [os.path.join('myproject/words', 'word_set.txt')]),
    ],

    install_requires=[ 'jsonschema',
        'logging', ],

     entry_points = {
        'console_scripts': [
            # Blah...
        ], },
)

আমি python setup.py sdistউত্স বিতরণের জন্য চালিত (বাইনারি চেষ্টা করিনি )।

এবং যখন একেবারে নতুন ভার্চুয়াল পরিবেশের ভিতরে থাকে তখন আমার কাছে একটি myproject-4.19.tar.gz, ফাইল থাকে এবং আমি ব্যবহার করি

(venv) pip install ~/myproject-4.19.tar.gz
...

আর সবকিছু বাদ দিয়ে অন্য আমার ভার্চুয়াল পরিবেশ এর ইনস্টল পেয়ে site-packages, ঐ বিশেষ ডেটা ফাইল ইনস্টল /opt/local/myproject/dataএবং /opt/local/myproject/etc


16

include_package_data=True আমার জন্য কাজ।

আপনি যদি গিট ব্যবহার করেন তবে এতে অন্তর্ভুক্ত করতে ভুলবেন setuptools-gitনা install_requiresManifestসমস্ত পাথ যুক্ত করা বা অন্তর্ভুক্ত করার চেয়ে কম বিরক্তিকর package_data(আমার ক্ষেত্রে এটি সমস্ত ধরণের স্ট্যাটিক্স সহ একটি জাঙ্গো অ্যাপ্লিকেশন)

(আমি যে মন্তব্যটি করেছি তা আটকানো হয়েছে, যেমন কে 3 -আরএনসি উল্লেখ করেছে যে এটি আসলে যেমন সহায়তা করে)


7

আপডেট : এই উত্তরটি পুরানো এবং তথ্য আর বৈধ নয়। সমস্ত সেটআপ.পি কনফিগার ব্যবহার করা উচিত import setuptools। আমি https://stackoverflow.com/a/49501350/64313 এ আরও একটি সম্পূর্ণ উত্তর যুক্ত করেছি


আমি এটি ডিসটুইলেটগুলিতে স্যুইচ করে সমাধান করেছি। দেখে মনে হচ্ছে বিতরণ হ্রাস করা হয়েছে এবং / অথবা ভাঙ্গা।

from distutils.core import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_data={
      'myapp': ['data/*.txt'],
   },
)

2
বিতরণ হ্রাস করা হয় না, এটি distutils প্রতিস্থাপন করা হয়। আমি জানি না কেন আপনি সমস্যা হচ্ছিলেন, তবে এটি কারণ নয়।
agf

1
আইআরসি-র কাছ থেকে পাওয়া প্রতিক্রিয়া আমি পেয়েছিলাম, তাহলে আমি কাকে বিশ্বাস করব? আপনার যদি বিতরণ ব্যবহার করে কাজের উদাহরণ থাকে তবে আমি প্রশংসা করব।
সেমিগারজিটি

6
স্পষ্টতা: বিতরণ সেটআপটুলগুলি প্রতিস্থাপন বোঝাতে হয়, উভয়ই ডিসটুইটের উপরে নির্মিত হয়। ডিস্টিলস নিজেই শেষ পর্যন্ত একটি নতুন প্যাকেজ দ্বারা প্রতিস্থাপন করা হবে, পাইথন 2 এ "ডিস্টুটিস 2" এবং পাইথন 3-তে "প্যাকেজিং"
কেভিন হর্ন

1
ডিস্টিলগুলিতে স্যুইচ করা আমার সমস্যাটি সমাধান করেছে যেখানে include_package_data=Trueসম্মান দেওয়া হচ্ছে না। সুতরাং সেটিংটির সাথে আপনার কেবল MANIFEST.in দরকার - package_dataসেটিংসে আপনার ফাইল তালিকাটি নকল করার দরকার নেই ।
ড্যানিয়েল সোকলোভস্কি

4

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

pip install . --install-option="--install-data=$PWD/package" -t package  

3

প্যাকেজ ডেটাযুক্ত ফোল্ডারটি মডিউল ফোল্ডারে সরানো আমার জন্য সমস্যার সমাধান করেছে।

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


3

কয়েক দিন ধরে আমার একই সমস্যা ছিল তবে সবকিছুই বিভ্রান্ত হওয়ার কারণে এমনকি এই থ্রেডটি আমাকে সহায়তা করতে সক্ষম হয়নি। সুতরাং আমি আমার গবেষণা করেছি এবং নিম্নলিখিত সমাধানগুলি পেয়েছি:

মূলত এই ক্ষেত্রে, আপনার করা উচিত:

from setuptools import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_dir={'myapp':'myapp'}, # the one line where all the magic happens
   package_data={
      'myapp': ['data/*.txt'],
   },
)

সম্পূর্ণ অন্যান্য স্ট্যাকওভারফ্লো উত্তর এখানে


এটি চেষ্টা করেছিলেন, কিন্তু এখনও কিছুই অনুলিপি করা হয় না।
জেরিট

3

কেবল লাইনটি সরিয়ে দিন:

include_package_data=True,

আপনার সেটআপ স্ক্রিপ্ট থেকে এবং এটি কার্যকর হবে work (সাম্প্রতিকতম সেটআপলগুলিতে এখনই পরীক্ষিত))


এটি পাগল তবে এটি উভয়ের সাথেই কাজ করে sdistএবং bdist_wheel, আপনি কেন পরীক্ষা করেছেন?
Szabolcs

1
আমি সত্যই নিশ্চিত করতে পারি যে এটি সেট হয়ে গেলে তা sdistউপেক্ষা করে package_data
স্যান্ডার স্টেফান

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

1

Setup.cfg ব্যবহার করে (সেটআপটুলগুলি ≥ 30.3.0)

30.3.0 সেটআপলুলগুলি (2016-12-08 প্রকাশিত) দিয়ে শুরু করে আপনি আপনার setup.pyখুব ছোট রাখতে পারেন এবং কনফিগারেশনটি কোনও setup.cfgফাইলে সরিয়ে নিতে পারেন। এই পদ্ধতির সাহায্যে আপনি আপনার প্যাকেজ ডেটাটি একটি [options.package_data]বিভাগে রাখতে পারেন:

[options.package_data]
* = *.txt, *.rst
hello = *.msg

এক্ষেত্রে আপনার setup.pyহিসাবে সংক্ষিপ্ত হতে পারে:

from setuptools import setup
setup()

আরও তথ্যের জন্য, setup.cfg ফাইল ব্যবহার করে সেটআপ কনফিগার করা দেখুন ।

নেই বিনয়ী কিছু আলাপsetup.cfg পক্ষে pyproject.tomlহিসাবে প্রস্তাবিত PEP 518 , কিন্তু এই এখনও 2020-02-21 হিসাবে কাঁচা হয়।


এই উত্তরটি MANIFEST ফাইলের উল্লেখ করতে অবহেলা করে তাই আমি মনে করি এটি আসলে এসডিস্টদের সাথে কাজ করবে না। শুধু চাকা দিয়ে। আপনি এটি উল্লেখ করা উচিত।
wim

@Wim আমার কাছে MANIFEST, sdist, এবং এর উত্তর দেওয়ার জন্য চাকা সম্পর্কে পর্যাপ্ত উপলব্ধি নেই। এটি আমার ব্যবহার করে কাজ করেছে pip install
অঙ্কিত

এটি কারণ pip install, পাইপের একটি আধুনিক পর্যাপ্ত সংস্করণের জন্য, প্রথমে একটি চাকা তৈরি করবে এবং তারপরে এটি ইনস্টল করবে। তবুও অনেক ব্যবহারকারীর ক্ষেত্রে এই পদ্ধতিটি চুপচাপ প্যাকেজ ডেটা অন্তর্ভুক্ত করতে ব্যর্থ হবে। সে সম্পর্কে বিস্তারিত তথ্যের জন্য স্বীকৃত উত্তর এবং এর অধীনে মন্তব্যগুলি দেখুন। একটি setup.cfgইতিমধ্যে setup.pyপ্রশ্নটিতে ওপি ইতিমধ্যে কী কাজ করছিল তা লেখার কেবল একটি ভিন্ন উপায় ( package_dataকলটিতে কীওয়ার্ড যুক্তিটি পাস করে setup), সুতরাং আমি এই প্রশ্নের উত্তর হিসাবে এটি বিশেষভাবে সহায়ক বলে মনে করি না । এটি অন্তর্নিহিত সমস্যাটি মোটেই সমাধান করছে না।
wim
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.