পাইথনপথ বনাম sys.path


95

আর একজন বিকাশকারী এবং আমি পাইথনপথ বা সিস.পাথকে ব্যবহারকারীর (যেমন, উন্নয়ন) ডিরেক্টরিতে পাইথন প্যাকেজ সন্ধানের জন্য পাইথনকে ব্যবহার করতে হবে কিনা সে সম্পর্কে আমি একমত নই।

আমাদের একটি পাইপথন প্রকল্প রয়েছে একটি আদর্শ ডিরেক্টরি কাঠামো সহ:

Project
    setup.py
    package
        __init__.py
        lib.py
        script.py

স্ক্রিপ্ট.পিতে, আমাদের করা দরকার import package.lib। যখন প্যাকেজটি সাইট-প্যাকেজে ইনস্টল করা হয়, স্ক্রিপ্ট.পি এটি সন্ধান করতে পারে package.lib

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

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

পাইথন যাতে এর স্থানীয় কপি খুঁজে পেতে পারে package.lib

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

আমাদের কি পাইথোনাপথ, সিএস.পথ ব্যবহার করা উচিত, না হয় ভাল?


4
মনে হচ্ছে ভোটগুলি এবং উত্তরগুলি PYTHON_PATH ব্যবহারের দিকে খুব সামান্য ঝোঁক দিয়ে মোটামুটি সমানভাবে বিভক্ত হয়েছে যদিও এটি প্রশ্ন থেকে নমুনা শব্দ বা অজান্তেই পক্ষপাতদুষ্ট হতে পারে।
এজেপি 11

মধ্যে যে পার্থক্য আছে PATHএবং sys.path(এবং পরোক্ষভাবে PYTHONPATH) দেখতে stackoverflow.com/questions/25344841/sys-path-vs-path
tripleee

উত্তর:


42

যদি পথটি সংশোধন করার একমাত্র কারণ হ'ল বিকাশকারীরা তাদের কার্যকরী গাছ থেকে কাজ করে থাকেন তবে আপনার নিজের পরিবেশ সেট আপ করার জন্য আপনার একটি ইনস্টলেশন সরঞ্জাম ব্যবহার করা উচিত। ভার্চুয়ালেনভ খুব জনপ্রিয় এবং আপনি যদি সেটআপলগুলি ব্যবহার করেন তবে আপনি setup.py developআপনার বর্তমান পাইথন ইনস্টলেশনটিতে কার্যত বৃক্ষকে আধা-ইনস্টল করতে ছুটে যেতে পারেন ।


11
আপনি কি এই বিষয়ে কিছুটা আরও স্পষ্টতা দিতে পারেন? এমনকি যদি আপনি কোনও কনডা / ভার্চুয়ালেনভ পরিবেশে দাঁড়িয়ে থাকেন তবে কীভাবে এটি আপনার অজগর পথে শীর্ষ স্তরের দির রাখবে?
compguy24

38

আমি পাইথনপথকে ঘৃণা করি। প্রতি ব্যবহারকারী ভিত্তিতে (বিশেষত ডেমন ব্যবহারকারীদের জন্য) সেট করা এবং প্রকল্প ফোল্ডারগুলির চারদিকে যেমন ঘোরাফেরা করা যায় তেমনি আমি খিঁচুনি এবং বিরক্তিকর বলে মনে করি। আমি বরং sys.pathস্বতন্ত্র প্রকল্পগুলির জন্য চালনার স্ক্রিপ্টগুলিতে সেট করব ।

তবে sys.path.appendএটি করার উপায় নয়। আপনি সহজেই সদৃশ পেতে পারেন এবং এটি .pthফাইলগুলি বাছাই করে না । উন্নত (এবং আরো পাঠযোগ্য): site.addsitedir

আর script.pyসাধারণত, এটা করতে আরো উপযুক্ত জায়গা হবে না যেমন আছে ভিতরে প্যাকেজ আপনি পাথ উপলব্ধ করতে চাই। গ্রন্থাগার মডিউলগুলি অবশ্যই তাদের স্পর্শ করা উচিত নয় sys.path। পরিবর্তে, অ্যাপটি ইনস্ট্যান্ট করতে এবং চালানোর জন্য আপনি যে প্যাকেজটি ব্যবহার করেন তার বাইরে সাধারণত একটি হ্যাশব্যাংড স্ক্রিপ্ট থাকতেন এবং এটি এই তুচ্ছ র‍্যাপার স্ক্রিপ্টে আপনি স্থাপনার বিবরণ যেমন- sys.pathফ্রোব্বিং রাখবেন।


17
সমস্যাটি site.addsitedirহ'ল এটি appendচালু হয় sys.path, অর্থাত একটি ইনস্টল করা প্যাকেজটি স্থানীয় প্যাকেজ বিকাশে অগ্রাধিকার গ্রহণ করবে (এবং চুল টানতে পারে)। sys.path.insert(0...এটি কাটিয়ে উঠতে হবে।
এলি বেন্ডারস্কি

4
@ এলিবেেন্ডারস্কি: হওয়া উচিত sys.path.insert(1stackoverflow.com/q/10095037/125507
এন্ডোলিথ

13

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

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


7

ইতিমধ্যে উল্লিখিত আরও অনেক কারণের সাথে আপনি সেই হার্ড-কোডিংয়েরও মুখোমুখি হতে পারেন

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

ভঙ্গুর কারণ এটি স্ক্রিপ্ট.পির অবস্থান অনুমান করে - স্ক্রিপ্ট.পিটি প্রকল্প / প্যাকেজে অবস্থিত থাকলেই এটি কাজ করবে। কোনও ব্যবহারকারী অন্য কোথাও / অনুলিপি / সিমিলেঙ্ক স্ক্রিপ্ট.পি (প্রায়) সরিয়ে নেওয়ার সিদ্ধান্ত নিলে এটি ভঙ্গ হবে।


5

আমি মনে করি, এই ক্ষেত্রে পাইথনপথ ব্যবহার করা একটি ভাল জিনিস, বেশিরভাগ কারণেই এটি আনুষঙ্গিক কোড প্রবর্তন করে না (প্রশ্নবিদ্ধ)।

সর্বোপরি, যদি আপনি এটির কথা চিন্তা করেন তবে আপনার ব্যবহারকারীর পক্ষে সেই sys.pathজিনিসটির প্রয়োজন নেই , কারণ আপনার প্যাকেজটি সাইট-প্যাকেজগুলিতে ইনস্টল হয়ে যাবে, কারণ আপনি প্যাকেজিং সিস্টেম ব্যবহার করবেন।

যদি ব্যবহারকারী "স্থানীয় অনুলিপি" থেকে চালনা করেন, আপনি যেমন কল করেন, তবে আমি পর্যবেক্ষণ করেছি যে স্বাভাবিক অনুশীলনটি হ'ল, প্যাকেজটি নিজেই পিথনপথে যোগ করতে হবে, যদি সাইট-প্যাকেজগুলির বাইরে ব্যবহার করা হয় if ।


3

উল্লিখিত কারণগুলির কারণে হ্যাকিং PYTHONPATHবা sys.pathকোনও ভাল ধারণা নয়। এবং বর্তমান প্রকল্পটি সাইট-প্যাকেজ ফোল্ডারে সংযুক্ত করার জন্য এখানে বর্ণিত python setup.py developহিসাবে আরও ভাল উপায় আছে :

pip install --editable path/to/project

আপনার প্রকল্পের মূল ফোল্ডারে যদি ইতিমধ্যে সেটআপ.পি না থাকে তবে এটি দিয়ে শুরু করার পক্ষে এটি যথেষ্ট ভাল:

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