أين هو Python's Sys.Path تهيئة من؟
سؤال
أين هو Python's Sys.Path تهيئة من؟
محدث: يضيف Python بعض المسارات قبل الرجوع إلى PythonPath:
>>> 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 هو:
PYTHONPATH=c:\testdir
أتساءل أين تأتي تلك المسارات قبل أن تأتي في PythonPath؟
المحلول
"تهيئة من البيئة المتغير pythonpath، بالإضافة إلى افتراضي تعتمد على التثبيت"
نصائح أخرى
Python يحاول حقا من الصعب ضبط بذكاء sys.path
. وبعد كيف يتم تعيين يمكن الحصول عليها حقا معقد. وبعد الدليل التالي هو وسقي أسفل، غير مكتملة إلى حد ما، خطأ غير مناسب إلى حد ما، ولكنه نأمل أن يكون دليل مفيد إلى حد ما لبرنامج Python الرتبة والملف لما يحدث عندما يكون ثعبان أرقام ما تستخدمه القيم الأولية من sys.path
,
sys.executable
, sys.exec_prefix
, ، و sys.prefix
على عاديتركيب بيثون.
أولا، يقوم Python بفضل مستوياته لمعرفة موقعه الفعلي الفعلي على نظام الملفات بناء على ما يخبره نظام التشغيل به. إذا كان نظام التشغيل يقول فقط "Python" قيد التشغيل، فهذا يجد نفسه في مسار $. يحل أي روابط رمزية. بمجرد أن فعل ذلك، يتم استخدام مسار الملف القابل للتنفيذ الذي يجده كقيمة sys.executable
, ، لا استثناءات، يستخدم المعامل، أو تحفظات.
بعد ذلك، فإنه يحدد القيم الأولية ل sys.exec_prefix
و sys.prefix
.
إذا كان هناك ملف يسمى pyvenv.cfg
في نفس الدليلsys.executable
أو دليل واحد يصل، تبدو بيثون في ذلك. أنظمة تشغيل مختلفة تفعل أشياء مختلفة مع هذا الملف.
واحدة من القيم في ملف التكوين هذا يبدو أن Python هو خيار التكوين home = <DIRECTORY>
. وبعد سيستخدم Python هذا الدليل بدلا من الدليل الذي يحتوي على sys.executable
عندما يحدد ديناميكيا القيمة الأولية لل sys.prefix
في وقت لاحق. إذا كان applocal = true
يظهر الإعداد فيpyvenv.cfg
ملف على ويندوز، ولكن ليس home = <DIRECTORY>
الإعداد، ثم sys.prefix
سيتم تعيين إلى الدليل الذي يحتوي عليه sys.executable
.
بعد ذلك، PYTHONHOME
يتم فحص متغير البيئة. على لينكس وجهاز ماك،sys.prefix
و sys.exec_prefix
تم ضبطها على PYTHONHOME
متغير البيئة، إذا كان موجودا، الحلزون أي home = <DIRECTORY>
اضبط pyvenv.cfg
. وبعد على ويندوز،sys.prefix
و sys.exec_prefix
تم تعيين إلى PYTHONHOME
متغير البيئة، إذا كان موجودا، ما لم أ home = <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
على Linux، Mac، و Windows، مع 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
.
إذن، (ما كنت تنتظره جميعا،) يحدد Python القيم الأولية التي سيتم تضمينها في sys.path
.
- تتم إضافة دليل البرنامج النصي الذي يتم تنفيذ Python إلى
sys.path
وبعد على Windows، هذه هي دائما السلسلة الفارغة، والتي تحدد Python لاستخدام المسار الكامل حيث يوجد البرنامج النصي بدلا من ذلك. - يتم إضافة محتويات PythonPath بيئة البيئة، إذا كانت المجموعة،
sys.path
, ما لم أنت على ويندوز وapplocal
تم تعيين إلى True فيpyvenv.cfg
. - مسار ملف zip، وهو
<prefix>/lib/python35.zip
على لينكس / ماك وos.path.join(os.dirname(sys.executable), "python.zip")
على ويندوز، يضاف إلىsys.path
. - إذا على النوافذ ولا
applocal = true
تم تعيين فيpyvenv.cfg
, ، ثم محتويات المفاتيح الفرعية لمفتاح التسجيلHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
تضاف، إن وجدت. - إذا على النوافذ ولا
applocal = true
تم تعيين فيpyvenv.cfg
, ، وsys.prefix
لا يمكن العثور عليها، ثم المحتويات الأساسية من مفتاح التسجيلHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
يضاف، إذا كان موجودا؛ - إذا على النوافذ ولا
applocal = true
تم تعيين فيpyvenv.cfg
, ، ثم محتويات المفاتيح الفرعية لمفتاح التسجيلHK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
تضاف، إن وجدت. - إذا على النوافذ ولا
applocal = true
تم تعيين فيpyvenv.cfg
, ، وsys.prefix
لا يمكن العثور عليها، ثم المحتويات الأساسية من مفتاح التسجيلHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
يضاف، إذا كان موجودا؛ - إذا لم يتم تعيين PythonPath، ولم يتم العثور على PythonPath، فلن يتم العثور على البادئة، ولا توجد مفاتيح التسجيل موجودة، ثم تتم إضافة القيمة الزمنية للترجمة النسبية ل PythonPath؛ خلاف ذلك، يتم تجاهل هذه الخطوة.
- تتم إضافة مسارات في كويسة الوقت الماكرو PythonPath نسبة إلى موجهة ديناميكيا
sys.prefix
. - على ماك و linux، قيمة
sys.exec_prefix
يضاف. على Windows، الدليل الذي تم استخدامه (أو كان قد استخدمه) للبحث بشكل حيوي عنsys.prefix
يضاف.
في هذه المرحلة من Windows، إذا لم يتم العثور على بادئة، فسيحاول Python تحديده عن طريق البحث الكل الدلائل في 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 ويفحص المسار المضافة حديثا لملفات التكوين حديثا.