كيف يمكنني العثور على موقع دليل حزم موقع Python الخاص بي؟
-
02-07-2019 - |
سؤال
كيف يمكنني العثور على موقع دليل حزم الموقع الخاص بي؟
المحلول
هناك نوعان من أدلة حزم الموقع، عالمي و لكل مستخدم.
عالمي حزم الموقع ("حزم التوزيع") يتم سرد الدلائل في
sys.path
عند تشغيل:python -m site
للحصول على قائمة أكثر إيجازا، قم بتشغيل
getsitepackages
من وحدة الموقع في كود بايثون:python -c "import site; print(site.getsitepackages())"
ملحوظة: مع Virtualenvs getsitepackages غير متوفر,
sys.path
من الأعلى سوف يسرد دليل حزم الموقع الخاص بـ virtualenv بشكل صحيح.ال لكل مستخدم دليل حزم الموقع (بيب 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))