সেটআপলগুলি বনাম ডিস্টুয়েলস: ডিস্টিউটিস এখনও একটি জিনিস কেন?


143

পাইথন সরঞ্জামগুলি আমাদের কাছে প্যাকেজ এবং প্রকল্প বর্ণনা করতে ব্যবহার করা যেতে পারে একটি বিভ্রান্তিকর ইতিহাস রয়েছে: এই অন্তর্ভুক্ত distutilsস্ট্যান্ডার্ড গ্রন্থাগারে, distribute, distutils2, এবং setuptools(এবং হয়তো আরো)। এটি প্রদর্শিত হয় distributeএবং distutils2তাদের পক্ষে বন্ধ করা হয়েছিল setuptools, যা দুটি প্রতিযোগিতামূলক মান ফেলে।

আমার বোধগম্যতার setuptoolsতুলনায় অনেক বেশি বিকল্প প্রস্তাব করা হয়েছে (যেমন নির্ভরতা, পরীক্ষা ইত্যাদি ঘোষণা করা) distutilsতবে পাইথন স্ট্যান্ডার্ড লাইব্রেরিতে (এখনও?) এটি অন্তর্ভুক্ত নয় is

পাইথন প্যাকেজিং ইউজার গাইড [ 1 ] এখন বিশেষ পরামর্শ দেওয়া হচ্ছে:

setuptoolsপ্রকল্পগুলি সংজ্ঞায়িত করতে এবং উত্স বিতরণ তৈরি করতে ব্যবহার করুন ।

এবং ব্যাখ্যা:

যদিও আপনি distutilsঅনেক প্রকল্পের জন্য খাঁটি ব্যবহার করতে পারেন , এটি অন্যান্য প্রকল্পের উপর নির্ভরতা নির্ধারণের পক্ষে সমর্থন করে না এবং সরবরাহ করা প্যাকেজ মেটাডেটা সঠিকভাবে পপুলেশন করার জন্য বেশ কয়েকটি সুবিধার্থে অনুপস্থিত setuptools। স্ট্যান্ডার্ড লাইব্রেরির বাইরে থাকায় সেটআপলগুলি পাইথনের বিভিন্ন সংস্করণ জুড়ে আরও সামঞ্জস্যপূর্ণ বৈশিষ্ট্য সরবরাহ করে এবং (বিপরীতে distutils) setuptoolsসমস্ত সমর্থিত সংস্করণে আসন্ন "মেটাডাটা ২.০" স্ট্যান্ডার্ড ফর্ম্যাটগুলি তৈরি করতে আপডেট করা হবে।

এমনকি যে প্রকল্পগুলি ব্যবহার করতে পছন্দ করে তাদের জন্য distutils, যখন পাইপ সরাসরি উত্স থেকে এই জাতীয় প্রকল্পগুলি ইনস্টল করে (প্রাক বিল্ট হুইল ফাইল থেকে ইনস্টল করার পরিবর্তে), এটি আসলে setuptoolsপরিবর্তে ব্যবহার করে আপনার প্রকল্প তৈরি করবে ।

যাইহোক, বিভিন্ন প্রকল্পের সেটআপ.পিপি ফাইলগুলি সন্ধান করা প্রকাশ করে যে এটি সত্যিকারের মান বলে মনে হচ্ছে না। অনেক প্যাকেজ এখনও ব্যবহার distutilsএবং সমর্থন ঐ যে setuptoolsপ্রায়ই মিশ্রিত করা setuptoolsসঙ্গে distutilsএকটি ফলব্যাক আমদানি করে যেমন:

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

এরপরে সেটআপ লেখার কোনও উপায় অনুসন্ধান করার চেষ্টা করা হয়েছে যা উভয় setuptoolsএবং দ্বারা ইনস্টল করা যেতে পারে distutils। এতে প্রায়শই ত্রুটি-প্রবণ নির্ভরতা পরীক্ষা করার বিভিন্ন উপায় অন্তর্ভুক্ত থাকে, যেহেতু distutilsসেটআপ ফাংশনে নির্ভরতা সমর্থন করে না।

লোকেরা কেন এখনও সমর্থন করার জন্য অতিরিক্ত চেষ্টা করে distutilsচলেছে - এটিই কি কারণ setuptoolsস্ট্যান্ডার্ড লাইব্রেরিতে নেই? কী কী সুবিধা রয়েছে distutilsএবং সেটআপ.পি ফাইলগুলি লেখার কোনও ত্রুটি রয়েছে যা কেবলমাত্র সমর্থন করে setuptools


4
distutilsএতে আবার একীভূত করা হয়েছেsetuptools , তবে এমন লিগ্যাসি অ্যাপ্লিকেশন রয়েছে যা ব্যবহার করার জন্য লেখা হয়েছিল distutilsএবং মানগুলি সংশোধন করার জন্য মাইগ্রেটে যাওয়ার জন্য জড়িত ব্যয় রয়েছে।
মেটাটোস্টার

3
"এটি প্রদর্শিত হয় যে বিতরণ এবং ডিস্টিওটিস 2 সেটআপলগুলির পক্ষে বন্ধ করা হয়েছিল", সঠিক, বিতরণ এখন সেটআপলগুলির জন্য কেবল একটি মোড়ক, এবং ডিস্ট্রিল 2 মারা গেছে।
কে - এসই খারাপ

1
setuptoolsএকটি উন্নত বিকল্প নেই distutilsকিন্তু নোট যে, " প্রস্তাবিত পিপ ইনস্টলার সঙ্গে সব setup.py স্ক্রিপ্ট রান setuptoolsএমনকি যদি স্ক্রিপ্ট নিজেই শুধুমাত্র আমদানি,distutils (" উৎস )
user2314737

উত্তর:


77

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

পাইথনে প্যাকেজিংয়ের জন্য ডিস্ট্রিটিলগুলি এখনও মানক সরঞ্জাম। এটি স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত করা হয়েছে (পাইথন 2 এবং পাইথন 3.0 থেকে 3.3)। এটি সাধারণ পাইথন বিতরণের জন্য দরকারী তবে বৈশিষ্ট্যের অভাব রয়েছে। এটি ডিস্টুয়েলস পাইথন প্যাকেজটি উপস্থাপন করে যা আপনার সেটআপ.পি স্ক্রিপ্টে আমদানি করা যায়।

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

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


3
"পাইথনে প্যাকেজিংয়ের জন্য ডিস্ট্রিটিলস এখনও স্ট্যান্ডার্ড সরঞ্জাম" " পাইথন প্যাকেজিং ব্যবহারকারী গাইডের বিপরীতে।
সেল

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

সম্প্রদায়টি আপনার সাথে একমত বলে মনে হচ্ছে বলে আমি আপনাকে অনুগ্রহ দান করেছি। দুর্ভাগ্যক্রমে এই প্রশ্নটি যতটা ইচ্ছা পেয়েছিলাম ততটা মনযোগ পেল না।
সেল

ইজি_ইনস্টল হ'ল মূল কারণ আমি সেটআপলগুলিকে প্রত্যাখ্যান করেছি - এটি প্যাকেজগুলিতে ব্যবহার করা আমার পক্ষে সমস্যার এক বিশাল উত্স হয়ে দাঁড়িয়েছে (কেবল পুনরুদ্ধার করা সহজ)। অন্যান্য বৈশিষ্ট্যগুলি ঠিক আছে।
স্টুয়ার্ট গাথম্যান

14

সেটআপলগুলি স্ট্যান্ডার্ড লাইব্রেরিতে না থাকার একমাত্র কারণ

এটি একটি কারণ। নিম্নলিখিতটি নিউমপিsetup.py থেকে সোজা :

if len(sys.argv) >= 2 and ('--help' in sys.argv[1:] or
        sys.argv[1] in ('--help-commands', 'egg_info', '--version',
                        'clean')):
    # Use setuptools for these commands (they don't work well or at all
    # with distutils).  For normal builds use distutils.
    try:
        from setuptools import setup
    except ImportError:
        from distutils.core import setup

সুতরাং setuptoolsএটি পেতে যদি NumPy পছন্দ করে। তবে তখন সায়পাই এটি করত, যতক্ষণ না এটি কিছু পরিস্থিতিতে পছন্দ করার জন্য প্যাচ করা হয়েছিল distutils। কমিট লগ উদ্ধৃত:

Setuptools sets mode +x on the test scripts, so that Nose refuses to run
them. Better not do that.

অবশ্যই, একটি সমবায় মধ্যে setuptoolsএবং distributeযথাসময়ে সব এই সমস্যার সমাধান হতে, কিন্তু অনেক প্যাকেজ এখনো পাইথন 2.6 ইনস্টলেশন সমর্থন করার জন্য প্রয়োজন।


1
distributeএকটি কাঁটাচামচ ছিল setuptoolsএবং এখন ফিরে একীভূত হয়।
4444

10

আমরা এখনও অনেকগুলি কারণ নিয়ে কথা বলি এবং ডিস্টিলগুলি ব্যবহার করি, যদিও সেটআপটোলগুলি নিঃসন্দেহে আরও ভাল সরঞ্জাম সেট।

প্রথমত, distutils সর্বত্র পাওয়া যায়। আপনি যদি অন্যের সাথে ভাগ করে নেওয়ার জন্য কোনও মডিউল তৈরি করতে চান এবং কোনও জটিল প্রয়োজনীয়তা না পান তবে এটি আপনার কাজের মেশিনে উপলব্ধ থাকার গ্যারান্টিযুক্ত। এটি বিশেষভাবে গুরুত্বপূর্ণ যদি আপনাকে অজগরটির পুরানো সংস্করণগুলি সমর্থন করতে হয়, বা যদি আপনি নিজেকে অপরিচিত পরিবেশে কাজ করতে দেখেন।

দ্বিতীয়ত, সেটআপলগুলি ডিস্টিলগুলিতে বর্ধিতকরণ সরবরাহ করে। সুতরাং এটি ডিস্টুলেটস সরঞ্জাম সেট করার পরে মডেল করা হয় এবং সেখান থেকে এর সমস্ত কাঠামো নিয়ে যায়। সেটআপলগুলির জন্য ডকুমেন্টেশন ধরে নেয় পাঠক ডিস্টুটিসগুলির সাথে परिचित এবং কেবলমাত্র এটি কীভাবে বেস সরঞ্জাম সেটকে বাড়ায় তা নথির সাথে ডকুমেন্ট। আপনি এটি ভাবতে পারেন যে ডিস্টুলিটগুলি উপভাষাকে সংজ্ঞায়িত করে এবং সেটআপলগুলি সেই উপভাষাকে উন্নত করে।

নতুন প্রকল্পগুলির জন্য আমার ব্যক্তিগত দৃষ্টিভঙ্গি আমি অনুমিত ব্যবহার করতে যাচ্ছি এই ধারণা দিয়েই শুরু। প্রকল্পটি সেটআপলগুলির একটি বৈশিষ্ট্য প্রয়োজন বিকাশের সাথে সাথে আমি কি আপগ্রেড করি। সেটআপলগুলি ডিস্টুটিসগুলির জন্য একটি ড্রপ-ইন-প্রতিস্থাপন, এটি আমার সেটআপ.পিতে এক-লাইন পরিবর্তন।


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

9

মূলত, এটি দায়িত্ব বিভাজনের কারণে।

setuptoolsপাইথন স্ট্যান্ডার্ড লাইব্রেরির অংশ নয় কারণ এটি পাইথন কোর দলের পরিবর্তে কোনও তৃতীয় পক্ষ দ্বারা রক্ষণাবেক্ষণ করা হয়। যার অর্থ, অন্যান্য জিনিসগুলির মধ্যে:

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

কার্যকরভাবে, মূল দলটি তৃতীয় পক্ষগুলিতে (বর্ধিত সংকলক / প্যাকেজ ফর্ম্যাট / যাই হোক না কেন সমর্থন) ছাড়িয়ে সমস্ত স্টাফ রেখে নিজের জন্য "মূল মান" এবং "নূন্যতম প্রয়োজনীয় সংকলন" অংশগুলি সংরক্ষণ করে, ডিস্টুয়েলের সুযোগগুলি সঙ্কুচিত করেছে । এই "বর্ধিত অংশগুলি" পূর্বে যে কোডটি প্রচ্ছদ করছিল সেটি পিছনের সামঞ্জস্যের জন্য বাসি ছিল

পাইথন মডিউল বিতরণ করা থেকে - পাইথন ২.7.১২ ডকুমেন্টেশন :

এর সরাসরি ব্যবহার distutilsপর্যায়ক্রমে করা হচ্ছে, এটি এখনও বর্তমান প্যাকেজিং এবং বিতরণ অবকাঠামোর ভিত্তি স্থাপন করেছিল এবং এটি কেবলমাত্র স্ট্যান্ডার্ড লাইব্রেরির অংশই থেকে যায় না, তবে এর নাম অন্যান্য উপায়েও বেঁচে থাকে (যেমন মেলিং তালিকার নাম) পাইথন প্যাকেজিং মান বিকাশের সমন্বয় করতে ব্যবহৃত)।

অন্যান্য ওএসের প্যাকেজগুলি একইভাবে পূর্বোক্ত কারণে setuptoolsও সরবরাহ করার সম্ভাবনা রয়েছেpip

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