সেটআপ.পি সহ পাইথনবিহীন ফাইলগুলি অন্তর্ভুক্ত


200

আমি কীভাবে setup.pyএমন একটি ফাইল অন্তর্ভুক্ত করব যা কোডের অংশ নয়? (বিশেষত, এটি একটি লাইসেন্স ফাইল, তবে এটি অন্য কোনও জিনিস হতে পারে))

আমি ফাইলের অবস্থান নিয়ন্ত্রণ করতে সক্ষম হতে চাই। মূল উত্স ফোল্ডারে, ফাইলটি প্যাকেজের মূলের মধ্যে রয়েছে। (যেমন শীর্ষস্থানীয় হিসাবে একই স্তরের উপরে __init__.py।) অপারেটিং সিস্টেম নির্বিশেষে প্যাকেজটি ইনস্টল করা অবস্থায় এটি ঠিক সেখানে থাকতে চাই। আমি কেমন করে ঐটি করি?


এই মুহুর্তে আপনি এটি কিভাবে করবেন? আপনার আগের প্রশ্নটি ইঙ্গিত করে যে আপনি কীভাবে লাইসেন্স ফাইল যুক্ত করবেন সে সম্পর্কে আপনার পরিচিত, তাই আপনার কোডটি কী "কাজ করে না"?
সাইলেন্টগোস্ট

2
data_files = [('', ['lgpl2.1_license.txt',]),]এটি পাইথন 26 ফোল্ডারে রাখে।
রাম রাছুম

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

ধন্যবাদ ইভান তবে সেটআপটুলগুলি ব্যবহার করে আমি পুরোপুরি ঠিক আছি, যেহেতু এটি প্রচলিত।
রাম রাছুম

উত্তর:


224

সম্ভবত এটি করার সর্বোত্তম উপায় হ'ল setuptools package_dataনির্দেশকে ব্যবহার করা । এর পরিবর্তে setuptools(বা distribute) ব্যবহার করার অর্থ এই নয় distutils, তবে এটি একটি অত্যন্ত বিজোড় "আপগ্রেড" "

এখানে একটি পূর্ণ (তবে অপরিবর্তিত) উদাহরণ রয়েছে:

from setuptools import setup, find_packages

setup(
    name='your_project_name',
    version='0.1',
    description='A description.',
    packages=find_packages(exclude=['ez_setup', 'tests', 'tests.*']),
    package_data={'': ['license.txt']},
    include_package_data=True,
    install_requires=[],
)

এখানে উল্লেখযোগ্য যে নির্দিষ্ট লাইনগুলি নোট করুন:

package_data={'': ['license.txt']},
include_package_data=True,

package_datadictনিদর্শনগুলির তালিকার একটি প্যাকেজ নাম (খালি = সমস্ত প্যাকেজ) হ'ল (গ্লোবগুলি অন্তর্ভুক্ত করতে পারে)। উদাহরণস্বরূপ, আপনি যদি আপনার প্যাকেজের মধ্যে কেবল ফাইলগুলি নির্দিষ্ট করতে চান তবে আপনি এটিও করতে পারেন:

package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}

সমাধান অবশ্যই এখানে নাpy কোনও .pyএক্সটেনশন দিয়ে আপনার অ- ফাইলের নাম পরিবর্তন করে ।

দেখা ইয়ান Bicking এর উপস্থাপনা আরও তথ্যের জন্য।

আপডেট: আরেকটি [আরও ভাল] পদ্ধতির

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

এই প্রতিক্রিয়াটি লেখার পরে, আমি খুঁজে পেয়েছি যে MANIFEST.inসাধারণত আপনার উত্স বিতরণ ( tar.gz) আপনার প্রয়োজনীয় ফাইল রয়েছে তা নিশ্চিত করার জন্য ব্যবহার করা সাধারণত হতাশাগ্রস্ত একটি পদ্ধতি ।

উদাহরণস্বরূপ, আপনি যদি requirements.txtশীর্ষ-স্তর থেকে অন্তর্ভুক্ত করতে চান, তবে পুনরাবৃত্তভাবে শীর্ষ-স্তরের "ডেটা" ডিরেক্টরি অন্তর্ভুক্ত করুন:

include requirements.txt
recursive-include data *

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


5
প্যাকেজ_ডাটা পাইথন ২.৩ থেকে খাঁটি ডিস্টিলস সেটআপ স্ক্রিপ্টগুলিতে উপলব্ধ।
এরিক আরাউজো

15
এই উত্তরটি বোধগম্য মনে হলেও আমার পক্ষে কাজ করে না। যেহেতু প্যাকেজ_ডেটা কুখ্যাতভাবে অবিশ্বাস্য (উভয় ক্ষেত্রে MANIFEST.in এর সমন্বয় প্রয়োজন এবং সেটআপ.পি পৃথক পদক্ষেপ হিসাবে ফাইলগুলি যুক্ত করুন এবং এটি ইনস্টল করুন, পৃথক পদক্ষেপ হিসাবে) এবং এই উত্তরের লেখক নোট করে যে এটি "পরীক্ষিত নয়", যে কেউ পারেন? অন্যথায় এটি তাদের জন্য কাজ করে কিনা তা নিশ্চিত করুন? আমার LICENSE ফাইলটি এসডিস্টে অন্তর্ভুক্ত করা হয়েছে, তবে আমি "পাইথন সেটআপ.পি ইনস্টল" বা "পাইপ ইনস্টল প্যাকেজ" চালানোর সময় ইনস্টল করা হয় না
জোনাথন হার্টলে

11
আয়ান বাইকিংয়ের উপস্থাপনা কেবল প্যাকেজের মধ্যে থাকা ফাইলগুলির প্যাকেজ ডেটা কীভাবে ইনস্টল করতে পারে তা দেখায়। আমার LICENSE ফাইলটি আমার প্রকল্পের শীর্ষ স্তরে, অর্থাত্ কোনও প্যাকেজে নেই। আমি কি এখনও প্যাকেজ_ডাটা ব্যবহার করতে পারি? ডেটা_ফায়াল ব্যবহার করা একটি অ-স্টার্টার কারণ এটি ফাইলগুলিকে সিস্টেম-ব্যাপী স্থানে রাখে। আমার প্রকল্পের সাথে সম্পর্কিত নয় এবং আরও খারাপ করার জন্য, একই এসডিস্ট থেকে আমি "সেটআপ.পি ইনস্টল" বা "পাইপ ইনস্টল" চালাই কিনা তার উপর নির্ভর করে অবস্থান পরিবর্তন হয় changes
জোনাথন হার্টলি

8
আমি অনুমান করছি যে এটি আমার পক্ষে কাজ করে না তার কারণটি হ'ল ফাইলটি কোনও প্যাকেজের মধ্যে নেই - এটি रिपাইজরির শীর্ষ স্তরের একটি লিসেনসি ফাইল, এবং তাই 'প্যাকেজ_ডেটা' ব্যবহার করে ইনস্টল করা যায় না
জোনাথন হার্টলি

7
এই উত্তরটি আমার পক্ষে কাজ করে না। অতিরিক্ত ফাইলগুলি
টার্বলটিতে ফেলা

44

আপনি যা বর্ণনা করছেন তা সম্পাদন করতে দুটি পদক্ষেপ নেওয়া হবে ...

  • ফাইলটি উত্স টার্বলটিতে যুক্ত করা দরকার
  • উত্সপথে ডেটা ফাইল ইনস্টল করতে setup.py এ পরিবর্তন করতে হবে

পদক্ষেপ 1: উত্স টার্বলগুলিতে ফাইল যুক্ত করতে, এটি MANIFEST এ অন্তর্ভুক্ত করুন

Setup.py রয়েছে এমন ফোল্ডারে একটি MANIFEST টেম্পলেট তৈরি করুন

MANIFEST মূলত উত্স টার্বাল অন্তর্ভুক্ত করা হবে এমন সমস্ত ফাইলের একটি তালিকা সহ একটি পাঠ্য ফাইল।

আমার প্রকল্পের জন্য তৈরি ম্যানিফয়েস্ট দেখতে এখানে:

  • CHANGELOG.txt
  • INSTALL.txt
  • LICENSE.txt
  • pypreprocessor.py
  • README.txt
  • setup.py
  • test.py
  • TODO.txt

নোট: যদিও sdist করে কিছু ফাইল স্বয়ংক্রিয়ভাবে যোগ , আমি স্পষ্টভাবে তাদের নিশ্চিত পরিবর্তে পূর্বাভাসের এটি কী এবং না হতে নির্দিষ্ট করতে পছন্দ করে।

পদক্ষেপ 2: উত্স ফোল্ডারে ডেটা ফাইল ইনস্টল করতে, setup.py পরিবর্তন করুন

যেহেতু আপনি উত্স ইনস্টল ফোল্ডারে একটি ডেটা ফাইল (LICENSE.txt) যুক্ত করতে খুঁজছেন আপনার উত্স ইনস্টলনের পাথের সাথে ম্যাচ করার জন্য ডেটা ইনস্টল পাথটি পরিবর্তন করতে হবে। এটি প্রয়োজনীয় কারণ ডিফল্টরূপে ডেটা ফাইলগুলি উত্স ফাইলগুলির চেয়ে পৃথক স্থানে ইনস্টল করা হয়।

উত্স ইনস্টল দির সাথে মেলে ডেটা ইনস্টল দির সংশোধন করতে ...

এর সাথে ডিস্টুয়েলগুলি থেকে ইনস্টল দির তথ্যটি টানুন:

from distutils.command.install import INSTALL_SCHEMES

উত্স ইনস্টল দির সাথে মেলে ডেটা ইনস্টল দির সংশোধন করুন:

for scheme in INSTALL_SCHEMES.values():
    scheme['data'] = scheme['purelib']

এবং, সেটআপে ডেটা ফাইল এবং অবস্থান যুক্ত করুন ():

data_files=[('', ['LICENSE.txt'])]

দ্রষ্টব্য: উপরের পদক্ষেপগুলিতে কোনও এক্সটেনশন লাইব্রেরির প্রয়োজন ছাড়াই আপনি স্ট্যান্ডার্ড পদ্ধতিতে যা বর্ণনা করেছেন ঠিক তা সম্পাদন করা উচিত।


10
উত্স কেবল তারবাল অন্তর্ভুক্ত শুধুমাত্র ফাইল নিয়ন্ত্রণ (এসডিস্ট দ্বারা উত্পাদিত)। সেখানে তালিকাভুক্ত ফাইল ইনস্টল করা হবে না।
ডেভিড কর্নিপাউ

@ ডেভিড আমি বুঝতে পারি নি যে আমি আমার প্রথম পদ্ধতির থেকে কতটা দূরে ছিলাম। কোনও অতিরিক্ত তৃতীয় পক্ষের লাইব্রেরির প্রয়োজন ছাড়াই প্রশ্নটি যা জিজ্ঞাসা করছিল তা সম্পাদনের জন্য উত্তরটি সঠিক হওয়ার জন্য আমি আপডেট করেছি।
ইভান প্লেইস

3
@ আরিক কোনও বিশেষ কারণ কেন? এবং, আপনার কাছে কি কোনও কার্যকর ইনস্টলার বিকল্প রয়েছে যার জন্য কাজ করার জন্য তৃতীয় পক্ষের প্যাকেজগুলির প্রয়োজন নেই (যেমন সেটআপ_টুলগুলি)। আমি সেটআপলগুলিতে ডিস্টিলেটগুলি বেছে নিয়েছিলাম কারণ এটি পাইথনের ভ্যানিলা ইনস্টলের সাথে অন্তর্ভুক্ত ছিল এবং আমি পিওয়াইপিআইয়ের জন্য মডিউল তৈরি করছিলাম। ডিস্টুটিস 2 ব্যবহার করে এটি করার আরও ভাল উপায় হওয়া উচিত তবে আমি অজগরটি স্পর্শ করি নি কিছুক্ষণের মধ্যে তাই আমি কীভাবে জানি না। যেহেতু আপনি ডিসটুইটাল 2 সম্পর্কে জ্ঞানসম্পন্ন বলে মনে করছেন আমি মনে করি এটি আমাদের বাকীগুলির জন্য একটি উপযুক্ত ডিস্টিল 2 বিকল্প রয়েছে have
ইভান প্লেস

6
যেমন অন্য থ্রেডে উল্লিখিত হয়েছে package_dataফাইলটি প্যাকেজে না থাকলে কাজ করে না।
গ্রিঙ্গো সুভেভ

2
@ এরিকআরাউজো: অন্য কোনও উপায় না থাকায় এই সমাধানটি ব্যবহার করা খারাপ ধারণা নয়। এটি একটি খারাপ ডিস্ট্রিল্ট ডিজাইন - এটি সত্য। তবে এটি ডি-ফ্যাক্টো পাবলিক এপিআই যা কখনও বদলাবে না কারণ এটি অনেকগুলি বিষয়কে ভেঙে দেবে। আসুন আশা করি যে ডিস্টুটিস 2 আরও ভাল প্রস্তাবিত উপায় প্রদান করবে।
অ্যানাটোলি টেকটোনিক


7

আমি একটি প্রশ্নের একটি মন্তব্য পোস্ট করতে চেয়েছিলাম তবে আমি এটি করতে যথেষ্ট খ্যাতি নেই>>>

আমার জন্য কী কাজ করেছে তা এখানে (ডক্স উল্লেখ করার পরে এটি নিয়ে এসেছিল):

package_data={
    'mypkg': ['../*.txt']
},

include_package_data: False

শেষ লাইনটি ছিল আমার জন্য আশ্চর্যজনকভাবে যথেষ্ট গুরুত্বপূর্ণ (আপনি এই কীওয়ার্ড যুক্তিটিও বাদ দিতে পারেন - এটি একই কাজ করে)।

এটি কী করে তা হ'ল এটি আপনার শীর্ষ-স্তর বা মূল ডিরেক্টরিতে সমস্ত পাঠ্য ফাইল অনুলিপি করে (প্যাকেজ থেকে এক স্তর উপরে) mypkg আপনি বিতরণ করতে চান তা )।

আশাকরি এটা সাহায্য করবে!


আমি কোনও উপায় তৈরি করতে MANIFEST.inচাইছি না এটি আমার জন্য কাজ করেছে। শেষ লাইনটিও আমার জন্য অত্যন্ত গুরুত্বপূর্ণ ছিল। আমার লাইনগুলি ছিলinclude_package_data=False, package_data={ "": ["../CHANGELOG.md"] },
মেনডাক

7

পদক্ষেপ 1:MANIFEST.in সেটআপ.পি দিয়ে একই ফোল্ডারে একটি ফাইল তৈরি করুন

পদক্ষেপ 2: আপনি যে ফাইলগুলিতে যুক্ত করতে চান তার সম্পর্কিত পাথ অন্তর্ভুক্ত করুনMANIFEST.in

include README.rst
include docs/*.txt
include funniest/data.json

পদক্ষেপ 3: এই ফাইলগুলি সাইট-প্যাকেজে অনুলিপি include_package_data=Trueকরতে setup()ফাংশনে সেট করুন

রেফারেন্স এখানে।


6

এটি 2019, এবং এখানে কাজ করছে - এখানে এবং সেখানে পরামর্শ সত্ত্বেও, আমি ইন্টারনেটে অর্ধেকটি নথিভুক্ত যা পেয়েছি তা setuptools_scmবিকল্প হিসাবে পাস হয়েছে setuptools.setup। এটিতে আপনার ভিসিএসে সংস্করণযুক্ত যে কোনও ডেটা ফাইল হুইল প্যাকেজটিতে অন্তর্ভুক্ত থাকবে, এটি গিট বা অন্য কোনও হোক, এবং সেই ফাইলগুলি আনতে গিট সংগ্রহস্থল থেকে "পাইপ ইনস্টল" করা হবে।

সুতরাং, আমি "সেটআপ.পি" তে সেটআপ কলটিতে এই দুটি লাইন যুক্ত করেছি। কোনও অতিরিক্ত ইনস্টল বা আমদানির প্রয়োজন নেই:

    setup_requires=['setuptools_scm'],
    include_package_data=True,

ম্যানুয়ালি প্যাকেজ_ডেটা বা কোনও MANIFEST.in ফাইলে তালিকাভুক্ত করার দরকার নেই - যদি এটির সংস্করণ হয় তবে এটি প্যাকেজে অন্তর্ভুক্ত করা হয়। "Setuptools_scm" এ থাকা দস্তাবেজগুলি কমিটের অবস্থান থেকে একটি সংস্করণ সংখ্যা তৈরি করার উপর জোর দেয় এবং ডেটা ফাইল যুক্ত করার সত্যিকারের গুরুত্বপূর্ণ অংশটিকে উপেক্ষা করে। (যদি আমার মধ্যবর্তী চাকা ফাইলটির নাম "* 0.2.2.dev45 + g3495a1f" হয় তবে আমি টাইপ করা হার্ডকোড সংস্করণ নম্বর "0.3.0dev0" ব্যবহার করব - তবে প্রোগ্রামটির জন্য গুরুত্বপূর্ণ ফাইলগুলি রেখে যাবে পিছনে কাজ কিছুটা গুরুত্বপূর্ণ)


5

সেটআপ.পিতে সেটআপের অধীনে (:

setup(
   name = 'foo library'
   ...
  package_data={
   'foolibrary.folderA': ['*'],     # All files from folder A
   'foolibrary.folderB': ['*.txt']  #All text files from folder B
   },

1
এটি আসলে ওপি'র লক্ষ্য অর্জনের দিকে কিছুই করে না। আপনি যেটিতে যা লিখবেন package_dataতার কোনও প্রভাব setup.py installনেই, যদি না আপনি ইনস্টল আদেশটি নিজেই পরিবর্তন করেন ify এই ফাইলগুলি প্যাকেজ ডিরেক্টরিের অধীনে না থাকলে, যা সাধারণত এমন কিছু যা আপনি এড়াতে চান।
wvxvw

3

এখানে একটি সহজ উত্তর আমার জন্য কাজ করেছে।

প্রথমত, উপরে পাইথন দেবের মন্তব্যে, সেটআপলগুলি প্রয়োজনীয় নয়:

package_data is also available to pure distutils setup scripts 
since 2.3.  Éric Araujo

এটি দুর্দান্ত কারণ আপনার প্যাকেজে একটি সেটআপলস প্রয়োজনীয়তা রাখার অর্থ এটি আপনাকেও ইনস্টল করতে হবে। সংক্ষেপে:

from distutils.core import setup

setup(
    # ...snip...
    packages          = ['pkgname'],
    package_data      = {'pkgname': ['license.txt']},
)

1
এটি অভিযোগ করবে যে ডিরেক্টরিটির pkgameঅস্তিত্ব নেই
অ্যান্থনি কং

1

আমি কেবল পাইথন ২.7 এর সাথে সেন্টোস on. এর সাথে কাজ করার মতো কিছু অনুসরণ করতে চেয়েছিলাম উপরে উল্লিখিত প্যাকেজ_ডাটা বা ডেটা_ফায়ালগুলি যুক্ত করা আমার পক্ষে কার্যকর হয়নি। আমি যে ফাইলগুলি চেয়েছিলাম তার সাথে একটি ম্যানিফেসেস্ট.আইএন যুক্ত করেছি যা পাইথন নন ফাইলগুলি টারবলটিতে ফেলেছিল তবে সেগুলি আরপিএমের মাধ্যমে টার্গেট মেশিনে ইনস্টল করে নি।

শেষ পর্যন্ত, আমি সেটআপ / সেটআপলগুলিতে "বিকল্পগুলি" ব্যবহার করে আমার সমাধানগুলিতে ফাইলগুলি পেতে সক্ষম হয়েছি। অপশন ফাইলগুলি আপনাকে সেটআপ.পিপি থেকে স্পেক ফাইলের বিভিন্ন বিভাগ পরিবর্তন করতে দেয়। নিম্নরূপ.

from setuptools import setup


setup(
    name='theProjectName',
    version='1',
    packages=['thePackage'],
    url='',
    license='',
    author='me',
    author_email='me@email.com',
    description='',
    options={'bdist_rpm': {'install_script': 'filewithinstallcommands'}},
)

ফাইল - MANIFEST.in:

include license.txt

ফাইল - ফাইলউইনস্টল কম্যান্ডস:

mkdir -p $RPM_BUILD_ROOT/pathtoinstall/
#this line installs your python files
python setup.py install -O1 --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES
#install license.txt into /pathtoinstall folder
install -m 700 license.txt $RPM_BUILD_ROOT/pathtoinstall/
echo /pathtoinstall/license.txt >> INSTALLED_FILES

-12

মূর্ত আউট একটি ওয়ার্কঅ্যারাউন্ড: আমি কি আমার নতুন নামকরণ lgpl2.1_license.txtকরার lgpl2.1_license.txt.pyএবং পাঠ্য কাছাকাছি কিছু ট্রিপল কোট করা। এখন আমার data_filesবিকল্পটি ব্যবহার করার বা কোনও নিখুঁত পাথ নির্দিষ্ট করার দরকার নেই। এটিকে পাইথন মডিউল বানানো কুৎসিত, আমি জানি, তবে আমি এটিকে নিখুঁত পাথগুলি নির্দিষ্ট করার চেয়ে কম কুৎসিত মনে করি।


7
আমার পোস্ট দেখুন। এটি কুশ্রী হতে হবে না। নেটে একটি ভাল উদাহরণ পাওয়া খুব কঠিন কারণ সেটআপ প্যাকেজগুলির জন্য ভাল ডকুমেন্টেশনগুলি খুঁজে পাওয়া শক্ত।
ইভান প্লেইস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.