كيف يمكنني العثور على موقع دليل حزم موقع Python الخاص بي؟

StackOverflow https://stackoverflow.com/questions/122327

  •  02-07-2019
  •  | 
  •  

سؤال

كيف يمكنني العثور على موقع دليل حزم الموقع الخاص بي؟

هل كانت مفيدة؟

المحلول

هناك نوعان من أدلة حزم الموقع، عالمي و لكل مستخدم.

  1. عالمي حزم الموقع ("حزم التوزيع") يتم سرد الدلائل في sys.path عند تشغيل:

    python -m site
    

    للحصول على قائمة أكثر إيجازا، قم بتشغيل getsitepackages من وحدة الموقع في كود بايثون:

    python -c "import site; print(site.getsitepackages())"
    

    ملحوظة: مع Virtualenvs getsitepackages غير متوفر, sys.path من الأعلى سوف يسرد دليل حزم الموقع الخاص بـ virtualenv بشكل صحيح.

  2. ال لكل مستخدم دليل حزم الموقع (بيب 370) هو المكان الذي تقوم فيه Python بتثبيت الحزم المحلية الخاصة بك:

    python -m site --user-site
    

    إذا كان هذا يشير إلى دليل غير موجود، فتحقق من حالة خروج Python وانظر python -m site --help للحصول على تفسيرات.

    تَلمِيح: جري pip list --user أو pip freeze --user يمنحك قائمة بجميع المثبتة لكل مستخدم حزم الموقع.


نصائح عملية

  • <package>.__path__ يتيح لك تحديد موقع (مواقع) حزمة معينة:(تفاصيل)

    $ python -c "import setuptools as _; print(_.__path__)"
    ['/usr/lib/python2.7/dist-packages/setuptools']
    
  • <module>.__file__ يتيح لك تحديد موقع وحدة معينة:(اختلاف)

    $ python3 -c "import os as _; print(_.__file__)"
    /usr/lib/python3.6/os.py
    
  • يجري pip show <package> لإظهار معلومات الحزمة بنمط دبيان:

    $ pip show pytest
    Name: pytest
    Version: 3.8.2
    Summary: pytest: simple powerful testing with Python
    Home-page: https://docs.pytest.org/en/latest/
    Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and others
    Author-email: None
    License: MIT license
    Location: /home/peter/.local/lib/python3.4/site-packages
    Requires: more-itertools, atomicwrites, setuptools, attrs, pathlib2, six, py, pluggy
    

نصائح أخرى

>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

(أو العنصر الأول فقط مع site.getsitepackages()[0])

من وثائق "كيفية تثبيت جانغو". (على الرغم من أن هذا مفيد لأكثر من مجرد تثبيت Django) - قم بتنفيذ ما يلي من الصدفة:

python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"

تم تنسيقه لسهولة القراءة (بدلاً من استخدامه كخط واحد)، ويبدو كما يلي:

from distutils.sysconfig import get_python_lib
print(get_python_lib())

لأوبونتو,

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

...غير صحيح.

وسوف يشير لك /usr/lib/pythonX.X/dist-packages

يحتوي هذا المجلد فقط على الحزم التي قام نظام التشغيل الخاص بك بتثبيتها تلقائيًا لتشغيل البرامج.

على أوبونتو, ، سيكون مجلد حزم الموقع الذي يحتوي على الحزم المثبتة عبر setup_tools\easy_install\pip موجودًا /usr/local/lib/pythonX.X/dist-packages

ربما يكون المجلد الثاني هو الأكثر فائدة إذا كانت حالة الاستخدام مرتبطة بالتثبيت أو قراءة التعليمات البرمجية المصدر.

إذا كنت لا تستخدم Ubuntu، فمن المحتمل أن تكون آمنًا بنسخ مربع الكود الأول ولصقه في الجهاز.

هذا ما نجح بالنسبة لي:

python -m site --user-site

لنفترض أنك قمت بتثبيت الحزمة "Django".قم باستيراده واكتب dir(Django).وسوف تظهر لك جميع الوظائف والسمات مع تلك الوحدة.اكتب مترجم بايثون -

>>> import django
>>> dir(django)
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'get_version']
>>> print django.__path__
['/Library/Python/2.6/site-packages/django']

يمكنك أن تفعل الشيء نفسه إذا قمت بتثبيت Mercurial.

هذا من أجل سنو ليوبارد.لكنني أعتقد أنه يجب أن يعمل بشكل عام أيضًا.

وكما لاحظ آخرون، distutils.sysconfig لديه الإعدادات ذات الصلة:

import distutils.sysconfig
print distutils.sysconfig.get_python_lib()

...على الرغم من الافتراضي site.py يفعل شيئًا أكثر فظًا، تمت إعادة صياغته أدناه:

import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])

(ويضيف أيضا ${sys.prefix}/lib/site-python ويضيف كلا المسارين لـ sys.exec_prefix وكذلك إذا كان هذا الثابت مختلفًا).

قيل: ما هو السياق؟لا ينبغي أن تعبث مع الخاص بك site-packages مباشرة؛ستعمل setuptools/distutils من أجل التثبيت، وقد يتم تشغيل برنامجك في بيئة افتراضية حيث يكون pythonpath الخاص بك مستخدمًا محليًا بالكامل، لذلك لا ينبغي أن يفترض استخدام حزم موقع النظام مباشرةً أيضًا.

يمكن العثور على حزم النظام الأصلية المثبتة مع تثبيت بايثون في الأنظمة المستندة إلى دبيان على:

/usr/lib/python2.7/dist-packages/

في أو إس إكس - /Library/Python/2.7/site-packages

باستخدام هذا الكود الصغير :

from distutils.sysconfig import get_python_lib
print get_python_lib()

ومع ذلك، فإن قائمة الحزم المثبتة عبر pip يمكن العثور عليها في :

/usr/local/bin/

أو يمكن للمرء ببساطة كتابة الأمر التالي لسرد جميع المسارات التي توجد بها حزم بايثون.

>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

ملحوظة:قد يختلف الموقع بناءً على نظام التشغيل لديك، كما هو الحال في OSX

>>> import site; site.getsitepackages()
['/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/site-python', '/Library/Python/2.7/site-packages']

جميع الإجابات (أو:نفس الإجابة المتكررة مرارا وتكرارا) غير كافية.ما تريد القيام به هو هذا:

from setuptools.command.easy_install import easy_install
class easy_install_default(easy_install):
  """ class easy_install had problems with the fist parameter not being
      an instance of Distribution, even though it was. This is due to
      some import-related mess.
      """

  def __init__(self):
    from distutils.dist import Distribution
    dist = Distribution()
    self.distribution = dist
    self.initialize_options()
    self._dry_run = None
    self.verbose = dist.verbose
    self.force = None
    self.help = 0
    self.finalized = 0

e = easy_install_default()
import distutils.errors
try:
  e.finalize_options()
except distutils.errors.DistutilsError:
  pass

print e.install_dir

السطر الأخير يظهر لك دليل التثبيت.يعمل على نظام Ubuntu، في حين أن الأنظمة المذكورة أعلاه لا تعمل.لا تسألني عن النوافذ أو الأقراص الأخرى، ولكن نظرًا لأنه نفس الدليل الذي يستخدمه easy_install افتراضيًا، فمن المحتمل أن يكون صحيحًا في كل مكان حيث يعمل easy_install (وبالتالي، في كل مكان، حتى أجهزة Mac).استمتع.ملحوظة:يحتوي الكود الأصلي على العديد من الشتائم فيه.

ملاحظة جانبية:الحل المقترح (distutils.sysconfig.get_python_lib()) لا يعمل عندما يكون هناك أكثر من دليل حزم الموقع (مثل الموصى بها في هذه المقالة).سيُرجع فقط دليل حزم الموقع الرئيسي.

للأسف، ليس لدي حل أفضل أيضا.يبدو أن بايثون لا تقوم بتتبع أدلة حزم الموقع، بل فقط الحزم الموجودة بداخلها.

هذا يعمل بالنسبة لي.سوف تحصل على كل من مجلدات dist-packages و site-packages.إذا لم يكن المجلد في طريق بيثون ، فلن يكون لك جيدًا على أي حال.

import sys; 
print [f for f in sys.path if f.endswith('packages')]

الإخراج (تثبيت أوبونتو):

['/home/username/.local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages']

ملاحظة اضافية ل get_python_lib الوظيفة المذكورة بالفعل:في بعض الأنظمة الأساسية، يتم استخدام أدلة مختلفة للوحدات النمطية الخاصة بالنظام الأساسي (على سبيل المثال:الوحدات التي تتطلب التجميع).إذا نجحت plat_specific=True إلى الوظيفة التي تحصل فيها على حزم الموقع للحزم الخاصة بالمنصة.

يجب أن يعمل هذا على جميع التوزيعات داخل وخارج البيئة الافتراضية نظرًا لطبيعتها "منخفضة التقنية".توجد وحدة نظام التشغيل دائمًا في الدليل الأصلي لـ "حزم الموقع"

import os; print(os.path.dirname(os.__file__) + '/site-packages')

لتغيير dir إلى site-packages dir، أستخدم الاسم المستعار التالي (على أنظمة *nix):

alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
from distutils.sysconfig import get_python_lib
print get_python_lib()

يتم استخدام طريقة stdlib الحديثة sysconfig الوحدة، متوفرة في الإصدار 2.7 و3.2+.تستخدم بايثون حاليا ثمانية مسارات (مستندات):

  • com.stdlib:الدليل الذي يحتوي على ملفات مكتبة Python القياسية التي لا تخص النظام الأساسي.
  • com.platstdlib:الدليل الذي يحتوي على ملفات مكتبة Python القياسية الخاصة بالنظام الأساسي.
  • com.platlib:دليل للملفات الخاصة بالموقع والنظام الأساسي.
  • purelib:دليل للملفات الخاصة بالموقع وغير الخاصة بالنظام الأساسي.
  • يشمل:دليل لملفات الرأس غير الخاصة بالنظام الأساسي.
  • بلاتينكلود:دليل لملفات الرأس الخاصة بالنظام الأساسي.
  • نصوص:دليل لملفات البرامج النصية.
  • بيانات:دليل لملفات البيانات.

في معظم الحالات، سيكون المستخدمون الذين يجدون هذا السؤال مهتمين بمسار "purelib" (في بعض الحالات, ، قد تكون مهتمًا بـ "platlib" أيضًا).على عكس الإجابة المقبولة حاليًا، لا ينبغي أن تعمل هذه الطريقة بشكل سيء اعتمادًا على ما إذا كان لديك بيئة افتراضية مفعلة أم لا.

على مستوى النظام (هذا هو Python 3.7.0 على نظام التشغيل Mac OS):

>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages'

مع venv، سوف تحصل على شيء من هذا القبيل

>>> import sysconfig                                                                                                                                                
>>> sysconfig.get_paths()['purelib']                                                                                                                                
'/private/tmp/.venv/lib/python3.7/site-packages'

يتوفر أيضًا برنامج نصي Shell لعرض هذه التفاصيل، والتي يمكنك استدعاؤها عن طريق التنفيذ sysconfig كوحدة نمطية:

python -m sysconfig

ملحوظة: sysconfig (مصدر) لا ينبغي الخلط بينه وبين distutils.sysconfig الوحدة الفرعية (مصدر) المذكورة في عدة إجابات أخرى هنا.هذه وحدة مختلفة تمامًا وتفتقر إلى get_paths وظيفة تمت مناقشتها أعلاه.

سيقدم عرض النقطة جميع التفاصيل حول الحزمة:https://pip.pypa.io/en/stable/reference/pip_show/ [عرض النقطة] [1]

للحصول على الموقع:

pip show <package_name>| grep Location

الإجابة على السؤال القديم.لكن استخدم ipython لهذا الغرض.

pip install ipython
ipython 
import imaplib
imaplib?

سيعطي هذا الإخراج التالي حول حزمة imaplib -

Type:        module
String form: <module 'imaplib' from '/usr/lib/python2.7/imaplib.py'>
File:        /usr/lib/python2.7/imaplib.py
Docstring:  
IMAP4 client.

Based on RFC 2060.

Public class:           IMAP4
Public variable:        Debug
Public functions:       Internaldate2tuple
                        Int2AP
                        ParseFlags
                        Time2Internaldate

كان علي أن أفعل شيئًا مختلفًا قليلاً لمشروع كنت أعمل عليه:أعثر على نسبي دليل حزم الموقع نسبة إلى بادئة التثبيت الأساسية.إذا كان مجلد حزم الموقع موجودًا /usr/lib/python2.7/site-packages, ، أردت /lib/python2.7/site-packages جزء.لقد واجهت، في الواقع، أنظمة حيث site-packages وكان في /usr/lib64, ، والإجابة المقبولة لم تعمل على تلك الأنظمة.

على غرار إجابة الغشاش، فإن الحل الذي قدمته يلقي نظرة خاطفة على أحشاء Distutils، للعثور على المسار الذي يتم تمريره بالفعل في الداخل setup.py.لقد كان من المؤلم معرفة أنني لا أريد أن يضطر أي شخص إلى اكتشاف ذلك مرة أخرى.

import sys
import os
from distutils.command.install import INSTALL_SCHEMES

if os.name == 'nt':
    scheme_key = 'nt'
else:
    scheme_key = 'unix_prefix'

print(INSTALL_SCHEMES[scheme_key]['purelib'].replace('$py_version_short', (str.split(sys.version))[0][0:3]).replace('$base', ''))

ينبغي أن طباعة شيء من هذا القبيل /Lib/site-packages أو /lib/python3.6/site-packages.

يجب عليك تجربة هذا الأمر لتحديد موقع تثبيت النقطة

بايثون 2

pip show six | grep "Location:" | cut -d " " -f2

بايثون 3

pip3 show six | grep "Location:" | cut -d " " -f2

إذا تمت إضافته بالفعل إلى PYTHONPATH يمكنك أيضًا أن تفعل شيئًا مثل

import sys
print('\n'.join(sys.path))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top