سؤال

أين هو 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، بالإضافة إلى افتراضي تعتمد على التثبيت"

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

نصائح أخرى

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.

  1. تتم إضافة دليل البرنامج النصي الذي يتم تنفيذ Python إلى sys.pathوبعد على Windows، هذه هي دائما السلسلة الفارغة، والتي تحدد Python لاستخدام المسار الكامل حيث يوجد البرنامج النصي بدلا من ذلك.
  2. يتم إضافة محتويات PythonPath بيئة البيئة، إذا كانت المجموعة، sys.path, ما لم أنت على ويندوز و applocal تم تعيين إلى True في pyvenv.cfg.
  3. مسار ملف zip، وهو <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. إذا لم يتم تعيين PythonPath، ولم يتم العثور على PythonPath، فلن يتم العثور على البادئة، ولا توجد مفاتيح التسجيل موجودة، ثم تتم إضافة القيمة الزمنية للترجمة النسبية ل PythonPath؛ خلاف ذلك، يتم تجاهل هذه الخطوة.
  9. تتم إضافة مسارات في كويسة الوقت الماكرو PythonPath نسبة إلى موجهة ديناميكيا sys.prefix.
  10. على ماك و 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 ويفحص المسار المضافة حديثا لملفات التكوين حديثا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top