কেন sys.path.insert (1, পাথ) এর পরিবর্তে sys.path.append (পথ) ব্যবহার করবেন?


89

সম্পাদনা: একটি উল্ফ রোম্পের মন্তব্যের ভিত্তিতে, আপনি "0" এর পরিবর্তে "1" ব্যবহার করা গুরুত্বপূর্ণ , অন্যথায় আপনি সিস্ট.পথটি ভেঙে ফেলবেন

আমি এখন (এক বছরেরও বেশি সময় ধরে) অজগরটি করে যাচ্ছি এবং লোকেরা আপনাকে sys.path.append()পরিবর্তে কেন ব্যবহারের পরামর্শ দেয় তা নিয়ে আমি সর্বদা বিভ্রান্ত হয়ে পড়েছি sys.path.insert()। আমাকে প্রদর্শন করুন।

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

উভয়কে নিয়ে কাজ করার একাধিক উপায় রয়েছে (উদাহরণস্বরূপ, আমি আমার পাইওয়ার্কবুকস প্রকল্পটি পাইজব্বের অভ্যন্তরে রেখে দিতে পারি) তবে মাঝে মাঝে আমার এখনও সেই পথটি নিয়ে খেলতে হবে। যাইহোক, পাইওয়ার্কবুকস যেখানে রয়েছে সেই ফোল্ডারে আমি কেবল একটি sys.path.append()করতে পারি না । কেন? কারণ পাইথন আমার ইনস্টলড পাইওয়র্কবুকগুলি প্রথমে খুঁজে পাবে!

এজন্য আপনাকে একটি sys.path.insert করতে হবে (1, পাথ_ টু_দেব_পাঠ্য বইগুলি)

সংক্ষেপে:

sys.path.append(path_to_dev_pyworkbooks)
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one

বা:

sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0**
import PyWorkbooks # imports correct file

এটি অতীতে আমার জন্য কয়েকটি হ্যাঙ্গআপ সৃষ্টি করেছে এবং আমি সত্যিই এটি চাই যদি আমরা (একটি সম্প্রদায় হিসাবে) সুপারিশ করা শুরু করি sys.path.insert(1, path), যেন আপনি ম্যানুয়ালি কোনও পথ সন্নিবেশ করিয়েছেন বলে আমি মনে করি এটি নিরাপদ যে আপনি যে পথটি চান তা বলা নিরাপদ ব্যবহার করা!

নাকি আমার কিছু ভুল আছে? এটি এমন একটি প্রশ্ন যা মাঝে মাঝে আমাকে বিরক্ত করে এবং আমি এটি প্রকাশ্যে চেয়েছিলাম!


4
আমি সম্পন্ন করেছি sys.path.insert(1, dev_folder)তবে এটি এখনও ডেভ মডিউলটি খুঁজে পাচ্ছে না, এবং কেবল ইনস্টল করা মডিউলটি ব্যবহার করছে। আমি কিভাবে এটা ঠিক করব?
এন্ডোলিথ

উত্তর:


47

আপনার যদি প্যাকেজ / মডিউলটির একাধিক সংস্করণ থাকে তবে আপনার ভার্চুয়ালেনভ (জোর দেওয়া খনি) ব্যবহার করা দরকার :

virtualenv বিচ্ছিন্ন পাইথন পরিবেশ তৈরির একটি সরঞ্জাম।

মূল সমস্যাটি হ'ল নির্ভরতা এবং সংস্করণগুলির একটি এবং পরোক্ষভাবে অনুমতি ly কল্পনা করুন আপনার কাছে এমন একটি অ্যাপ্লিকেশন রয়েছে যার জন্য LibFoo এর সংস্করণ 1 প্রয়োজন, তবে অন্য অ্যাপ্লিকেশনটির জন্য 2 সংস্করণ প্রয়োজন you আপনি এই অ্যাপ্লিকেশনটি কীভাবে ব্যবহার করতে পারেন? আপনি যদি সমস্ত কিছু ইনস্টল করেন /usr/lib/python2.7/site-packages(বা আপনার প্ল্যাটফর্মের স্ট্যান্ডার্ড অবস্থান যাই হোক না কেন), এমন পরিস্থিতিতে শেষ হওয়া সহজ যেখানে আপনি অজান্তে কোনও অ্যাপ্লিকেশন আপগ্রেড করবেন না যা আপগ্রেড করা উচিত নয়।

বা আরও সাধারণভাবে, আপনি যদি কোনও অ্যাপ্লিকেশন ইনস্টল করতে চান এবং তা ছেড়ে দিতে চান ? যদি কোনও অ্যাপ্লিকেশন কাজ করে তবে এর লাইব্রেরিতে বা libra লাইব্রেরির সংস্করণগুলির যে কোনও পরিবর্তন অ্যাপ্লিকেশনটিকে ভেঙে দিতে পারে।

এছাড়াও, যদি আপনি বিশ্ব site-packagesডিরেক্টরিতে প্যাকেজ ইনস্টল করতে না পারেন ? উদাহরণস্বরূপ, একটি শেয়ার্ড হোস্টে।

এই সমস্ত ক্ষেত্রে, virtualenvআপনাকে সহায়তা করতে পারে। এটি এমন একটি পরিবেশ তৈরি করে যার নিজস্ব ইনস্টলেশন ডিরেক্টরি রয়েছে, যা অন্যান্য ভার্চুয়ালএনভ পরিবেশের সাথে লাইব্রেরিগুলি ভাগ করে না (এবং বৈশ্বিকভাবে ইনস্টল করা লাইব্রেরিগুলিতে অ্যাক্সেস করে না)।

এ কারণেই লোকেরা insert(0, ভুল হিসাবে বিবেচনা করে - এটি একাধিক পরিবেশ পরিচালনার সমস্যাটির একটি অসম্পূর্ণ, স্টপগ্যাপ সমাধান।


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

4
এটি একটি পরামর্শ তবে সরাসরি প্রশ্নের উত্তর দেয় না (উদাহরণস্বরূপ, আমি না ব্যবহারের virtualenv
দৃ strong়

@ জাভাদবা আপনার ক্ষেত্রে এটি সত্য হতে পারে তবে এই প্রশ্নটি করা বেশিরভাগ লোকদের ব্যবহার করা উচিত venv
এগ্রাফ

46

আপনার যদি সত্যই sys.path.insert ব্যবহার করা প্রয়োজন, sys.path [0] কে যেমন রাখবেন তেমন বিবেচনা করুন:

sys.path.insert(1, path_to_dev_pyworkbooks)

এটি গুরুত্বপূর্ণ হতে পারে যেহেতু তৃতীয় পক্ষের কোড sys.path ডকুমেন্টেশন কনফারেন্সের উপর নির্ভর করতে পারে :

প্রোগ্রাম শুরু হওয়ার পরে, সূচকের প্রথম আইটেম, পাথ [0], হ'ল ডিরেক্টরিটি স্ক্রিপ্টযুক্ত পাইথন ইন্টারপ্রেটারকে অনুরোধ করার জন্য ব্যবহৃত হত।


13

আপনি সংযোজন এবং সংশোধন করার ধারণাটি বিভ্রান্ত করছেন। নিম্নলিখিত কোডটি প্রেন্ডিং করছে:

sys.path.insert(1,'/thePathToYourFolder/')

এটি আপনার দোভাষী মাধ্যমে যে অনুসন্ধান সিকোয়েন্সটি করবে তার শুরুতে (ভাল, দ্বিতীয়, সুনির্দিষ্ট হতে) নতুন তথ্য রাখে। sys.path.append()অনুসন্ধান ক্রমের একেবারে শেষে জিনিসগুলি রাখে।

আপনি virtualenvআপনার প্যাকেজ ডিরেক্টরিগুলিকে ম্যানুয়ালি কোডিংয়ের পরিবর্তে এ জাতীয় কিছু ব্যবহার করার পরামর্শ দেওয়া হচ্ছে PYTHONPATH। আপনার সাইট-প্যাকেজগুলি এবং পাইথনের সম্ভাব্য সংস্করণগুলিকে পৃথককারী বিভিন্ন বাস্তুসংস্থান স্থাপনের জন্য, এই দুটি ব্লগ পড়ুন:

  1. পাইথন বাস্তুতন্ত্রের ভূমিকা

  2. পাইথন ভার্চুয়াল পরিবেশ বুটস্ট্র্যাপিং

আপনি যদি পরিবেশ বিচ্ছিন্ন হওয়ার পথে নেমে যাওয়ার সিদ্ধান্ত নেন তবে আপনি অবশ্যই ভ্যুচুয়ালেনভ্রাপার অনুসন্ধান করে উপকৃত হবেন: http://www.doughellmann.com/docs/virtualenvwrapper/


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