পাইথনের সিএস.পথ কোথা থেকে শুরু হয়েছিল?


111

পাইথনের সিএস.পথ কোথা থেকে শুরু হয়েছিল?

ইউপিডি : পাইথন পাঠ করার আগে পাইথন কিছু পথ যুক্ত করছে:

    >>> import sys
    >>> from pprint import pprint as p
    >>> p(sys.path)
    ['',
     'C:\\Python25\\lib\\site-packages\\setuptools-0.6c9-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\orbited-0.7.8-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\morbid-0.8.6.1-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\demjson-1.4-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\stomper-0.2.2-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\uuid-1.30-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\stompservice-0.1.0-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\cherrypy-3.0.1-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\pyorbited-0.2.2-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\flup-1.0.1-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\wsgilog-0.1-py2.5.egg',
     'c:\\testdir',
     'C:\\Windows\\system32\\python25.zip',
     'C:\\Python25\\DLLs',
     'C:\\Python25\\lib',
     'C:\\Python25\\lib\\plat-win',
     'C:\\Python25\\lib\\lib-tk',
     'C:\\Python25',
     'C:\\Python25\\lib\\site-packages',
     'C:\\Python25\\lib\\site-packages\\PIL',
     'C:\\Python25\\lib\\site-packages\\win32',
     'C:\\Python25\\lib\\site-packages\\win32\\lib',
     'C:\\Python25\\lib\\site-packages\\Pythonwin']

আমার পাইথনপথটি হ'ল:

    PYTHONPATH=c:\testdir

আমি ভাবছি পাইথনপথের আগে সেই পথগুলি কোথা থেকে এসেছে?

উত্তর:


49

"এনভায়রনমেন্ট ভেরিয়েবল পাইথনপথ থেকে শুরু, একটি ইনস্টলেশন-নির্ভর ডিফল্ট"

- http://docs.python.org/library/sys.html#sys.path


7
আমি অনুমান করি যে তারা সাইট মডিউল থেকে এসেছে: ডকস.পিথন.আর.ইলবাড়ী
অ্যাশচ্যাচ

20
সাইট মডিউল আপনার সাইট-প্যাকেজ ডিরেক্টরিতে কোনও .pth ফাইলের সামগ্রী লোড করে এবং পার্স করে। এই .pth ফাইলগুলিতে আপনার পাইথনপথে সংযোজন রয়েছে
জিজ্ঞাসা করুন

77

পাইথন সত্যিই বুদ্ধিমানভাবে সেট করার জন্য কঠোর চেষ্টা করে sys.path। এটি কীভাবে সেট করা আছে তা সত্যিই জটিল হয়ে উঠতে পারে । নিম্নলিখিত নির্দেশিকা একটি watered ডাউন, কিছুটা-অসম্পূর্ণ, কিছুটা-ভুল, কিন্তু আশা করছি-দরকারী সেখানে কি ঘটছে পাইথন পরিসংখ্যান কি হিসাবে ব্যবহার করার জন্য আউট যখন পদে-এবং-ফাইল পাইথন প্রোগ্রামার জন্য পথপ্রদর্শক হয় প্রাথমিক মান এর sys.path, sys.executable, sys.exec_prefix, এবং sys.prefixএকটি সাধারণ অজগর ইনস্টলেশন।

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

এর পরে, এটি sys.exec_prefixএবং এর জন্য প্রাথমিক মানগুলি নির্ধারণ করে sys.prefix

যদি pyvenv.cfgএকই ডিরেক্টরিতে sys.executableবা একটি ডিরেক্টরি হিসাবে কোনও ফাইল কল করা থাকে, অজগর এটি দেখবে। বিভিন্ন ওএস এই ফাইলটি দিয়ে বিভিন্ন জিনিস করে।

এই কনফিগার ফাইলে যে মানগুলির মধ্যে পাইথন রয়েছে তার মধ্যে একটি হল কনফিগারেশন বিকল্প home = <DIRECTORY>। পাইথন এই ডিরেক্টরিটি ডিরেক্টরি পরিবর্তে ব্যবহার করবে sys.executable যখন এটি গতিরূপে পরেটির প্রাথমিক মান সেট করে sys.prefix। যদি উইন্ডোজে ফাইলটিতে applocal = trueসেটিংটি উপস্থিত হয় pyvenv.cfgতবে home = <DIRECTORY>সেটিংসটি নয়, তবে sys.prefixসেই ডিরেক্টরিতে সেট করা থাকবে sys.executable

এরপরে, PYTHONHOMEপরিবেশের পরিবর্তনশীল পরীক্ষা করা হয়। লিনাক্স এবং ম্যাক এ, sys.prefixএবং পরিবেশের পরিবর্তনশীলতে sys.exec_prefixসেট করা PYTHONHOMEথাকে যদি এটি উপস্থিত থাকে তবে যে কোনও সেটিংসকে ছাড়িয়ে যাবে । উইন্ডোজে এবং পরিবেশের পরিবর্তনশীলতে সেট করা থাকে, যদি এটি উপস্থিত থাকে, যদি না কোনও সেটিং উপস্থিত থাকে তবে পরিবর্তে ব্যবহৃত হয়।home = <DIRECTORY>pyvenv.cfgsys.prefixsys.exec_prefixPYTHONHOMEhome = <DIRECTORY>pyvenv.cfg

অন্যথায়, এগুলি sys.prefixএবং sys.exec_prefixঅবস্থানের দিক থেকে পিছনে হেঁটে sys.executableবা যদি কোনও homeডিরেক্টরি দ্বারা প্রদত্ত ডিরেক্টরি খুঁজে পাওয়া যায় pyvenv.cfg

যদি ফাইলটি lib/python<version>/dyn-loadডিরেক্টরিটি বা তার যে কোনও মূল ডিরেক্টরিতে পাওয়া যায়, তবে সেই ডিরেক্টরিটি sys.exec_prefixলিনাক্স বা ম্যাকের জন্য সেট করা আছে । lib/python<version>/os.pyডিরেক্টরিতে বা এর কোনও উপ-ডিরেক্টরিতে যদি ফাইলটি পাওয়া যায়, তবে সেই ডিরেক্টরিটি sys.prefixলিনাক্স, ম্যাক এবং উইন্ডোজে sys.exec_prefixসেট করা আছে, sys.prefixউইন্ডোজ হিসাবে একই মান হিসাবে সেট করা হবে । যদি applocal = trueসেট করা থাকে তবে এই পুরো পদক্ষেপটি উইন্ডোজটিতে এড়িয়ে যায় । হয় ডিরেক্টরি sys.executableব্যবহার করা হয় অথবা যদি homeসেট করা থাকে তবে এর pyvenv.cfgপরিবর্তে এর প্রাথমিক মান ব্যবহার করা হবে sys.prefix

যদি এটি "ল্যান্ডমার্ক" ফাইলগুলি খুঁজে না পায় বা sys.prefixএখনও খুঁজে পাওয়া যায় না, তবে পাইথন sys.prefixএকটি "ফ্যালব্যাক" মান সেট করে। Linux এবং Mac, উদাহরণস্বরূপ, ব্যবহারের মান হিসাবে প্রাক কম্পাইল অক্ষমতা sys.prefixএবং sys.exec_prefix। উইন্ডোজটির sys.pathজন্য একটি ফ্যালব্যাক মান সেট করার জন্য পুরোপুরি অঙ্কিত হওয়া অবধি অপেক্ষা করে sys.prefix

তারপরে, (অজগর আপনি কীসের জন্য অপেক্ষা করছিলেন) অজগরটি অন্তর্ভুক্ত থাকা প্রাথমিক মানগুলি নির্ধারণ করে sys.path

  1. পাইথনটি স্ক্রিপ্টের ডিরেক্টরিটিতে যুক্ত করা হয়েছে sys.path। উইন্ডোজে এটি সর্বদা খালি স্ট্রিং, যা অজগরকে স্ক্রিপ্টের পরিবর্তে যেখানে অবস্থিত সেখানে পুরো পথটি ব্যবহার করতে বলে।
  2. পাইথনপথ এনভায়রনমেন্ট ভেরিয়েবলের বিষয়বস্তু যদি সেট করা থাকে তবে এতে যুক্ত করা হয় sys.path, যদি না আপনি উইন্ডোজটিতে থাকেন এবং applocalসত্যে সেট না হয়ে থাকেন pyvenv.cfg
  3. <prefix>/lib/python35.zipলিনাক্স / ম্যাক এবং os.path.join(os.dirname(sys.executable), "python.zip")উইন্ডোতে থাকা জিপ ফাইল পাথটি যুক্ত করা হয়েছে sys.path
  4. যদি উইন্ডোতে এবং কোনও applocal = trueসেট না করা থাকে pyvenv.cfg, তবে রেজিস্ট্রি কীর সাবকিগুলিগুলির বিষয়বস্তু HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\যুক্ত করা হয়, যদি থাকে।
  5. যদি উইন্ডোজে এবং কোনও applocal = trueসেট করা থাকে pyvenv.cfg, এবং sys.prefixখুঁজে পাওয়া যায় না, তবে রেজিস্ট্রি কীটির মূল বিষয়বস্তুHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ যুক্ত করা হয়, যদি তা বিদ্যমান থাকে;
  6. যদি উইন্ডোতে এবং কোনও applocal = trueসেট না করা থাকে pyvenv.cfg, তবে রেজিস্ট্রি কীর সাবকিগুলিগুলির বিষয়বস্তু HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\যুক্ত করা হয়, যদি থাকে।
  7. যদি উইন্ডোজে এবং কোনও applocal = trueসেট করা থাকে pyvenv.cfg, এবং sys.prefixখুঁজে পাওয়া যায় না, তবে রেজিস্ট্রি কীটির মূল বিষয়বস্তুHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ যুক্ত করা হয়, যদি তা বিদ্যমান থাকে;
  8. যদি উইন্ডোজে, এবং পাইথনপথ সেট না করা থাকে, উপসর্গটি পাওয়া যায় নি, এবং কোনও রেজিস্ট্রি কী উপস্থিত ছিল না, তবে পাইথনপথের তুলনামূলক সময়ের সংকলন মান যুক্ত করা হয়; অন্যথায়, এই পদক্ষেপটি উপেক্ষা করা হবে।
  9. সংকলন-সময় ম্যাক্রো পাইথনপথের পাথগুলি গতিশীলভাবে পাওয়া-এর সাথে যুক্ত হয়েছে sys.prefix
  10. ম্যাক এবং লিনাক্সে, এর মান sys.exec_prefixযুক্ত হয়। উইন্ডোজে, গতিশীলভাবে অনুসন্ধানের জন্য যে ডিরেক্টরিটি ব্যবহার করা হত (বা ব্যবহৃত হত) sys.prefixযুক্ত করা হয়েছে।

উইন্ডোজের এই পর্যায়ে, যদি কোনও উপসর্গ পাওয়া যায় না, তবে পাইথন ল্যান্ডমার্ক ফাইলগুলির জন্য সমস্ত ডিরেক্টরি অনুসন্ধান করে এটি নির্ধারণ করার চেষ্টা করবে sys.path, যেমন এটি sys.executableপূর্ববর্তী ডিরেক্টরিগুলির সাথে করার চেষ্টা করেছিল , যতক্ষণ না এটি কিছু খুঁজে পায়। যদি তা না sys.prefixহয় তবে ফাঁকা রেখে দেওয়া হয়।

সবশেষে, পাইথন siteমডিউলটি লোড করে , যা স্টাফটিকে আরও আরও যুক্ত করে sys.path:

এটি একটি মাথা এবং একটি পুচ্ছ অংশ থেকে চারটি ডিরেক্টরি নির্মাণ করে শুরু হয়। মাথার অংশের জন্য, এটি ব্যবহার করে sys.prefixএবং sys.exec_prefix; খালি মাথা বাদ দেওয়া হয়। লেজ অংশের জন্য, এটি খালি স্ট্রিং এবং তারপরে lib/site-packages(উইন্ডোজে) বা lib/pythonX.Y/site-packages তারপরে lib/site-python(ইউনিক্স এবং ম্যাকিনটোসে) ব্যবহার করে। প্রতিটি পৃথক হেড-লেজ সংমিশ্রণের জন্য, এটি দেখতে পাবে যে এটি কোনও বিদ্যমান ডিরেক্টরিকে বোঝায় কিনা এবং যদি তা থাকে তবে এটি sys.path এ যুক্ত করে এবং কনফিগারেশন ফাইলগুলির জন্য নতুন যুক্ত হওয়া পথটিও পরীক্ষা করে।


1
এর ডক্স যা বলছে তা সত্ত্বেও, sys.executableএকটি সিমিলিংক হতে পারে বা argv[0]স্ল্যাশগুলি থাকলে এটি কিছু হতে পারে । এক্সিকিউটেবল ( কল থেকে ) আসল পথexecv(path, argv) ব্যবহার করা হয় না।
jfs

1
sys.pathউইন্ডোজ 10 এ আপনার প্রথম পয়েন্টটি সম্পর্কিত : আমি সর্বদা আমার স্ক্রিপ্ট দির পুরো পথটি sys.path [0] (cwd '' নয়) হিসাবে পাই। আপনার মত কিছু চালানো উচিতpython some\other\path\than\cwd\main.py
ford04

আমি @ ford04 এর সাথে একমত পয়েন্ট 1 ভুল: উইন্ডোজে স্ক্রিপ্টের ডিরেক্টরিটি sys.path এ যুক্ত করা হয়, একটি ফাঁকা পথ নয়, সিডব্লিউডি। এটি বিভিন্ন পাইথন 3.x ইনস্টলগুলিতে রয়েছে।
বিশ্বব্যাপী

1
বাহ, এটা দুর্দান্ত! আমি এই বিষয়ে হোঁচট খাওয়ার আগে প্রায় 10 টি প্রশ্ন এবং উত্তর দেখেছি, "সত্য", যদিও আপনি স্বীকার করছেন যে আপনার কাছে এগুলি সমস্তই নেই।
মাইক উইলিয়ামসন

1
আমি প্রাসঙ্গিক ফাইল যোগ হবে site-packagesআছে .pthএবং .egg-linkপ্রত্যয়।
ফ্লোরিস্টা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.