كيف يمكنني الحصول على قائمة وحدات بيثون المثبتة محليا؟
سؤال
أرغب في الحصول على قائمة من وحدات Python، والتي توجد في تثبيت Python الخاص بي (خادم UNIX).
كيف يمكنك الحصول على قائمة من وحدات Python المثبتة في جهاز الكمبيوتر الخاص بك؟
المحلول
المحلول
لا تستخدم مع PIP> 10.0!
بلدي 50 سنت للحصول على pip freeze
- مثل قائمة من النصي الثعبان:
import pip
installed_packages = pip.get_installed_distributions()
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
for i in installed_packages])
print(installed_packages_list)
كأداة (طويلة جدا) واحد بطانة:
sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
إعطاء:
['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24',
'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3',
'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0',
'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1',
'werkzeug==0.9.4']
مجال
ينطبق هذا الحل على نطاق النظام أو إلى نطاق بيئة افتراضية، ويغطي الحزم المثبتة بواسطة setuptools
, pip
و (لا سمح الله) easy_install
.
حالة استخدام بلدي
أضفت نتيجة هذه المكالمة إلى خادم القارورة الخاص بي، لذلك عندما أسميها http://example.com/exampleServer/environment
أحصل على قائمة الحزم المثبتة على Virtualenv الخادم. يجعل تصحيح أسهل بكثير.
تحفظات
لقد لاحظت سلوكا غريبا لهذه التقنية - عندما يتم استدعاء مترجم الثعبان في نفس الدليل setup.py
ملف، لا يسرد الحزمة المثبتة setup.py
.
خطوات إعادة إنشاء:
إنشاء بيئة افتراضية$ cd /tmp
$ virtualenv test_env
New python executable in test_env/bin/python
Installing setuptools, pip...done.
$ source test_env/bin/activate
(test_env) $
استنساخ جيت ريبو مع setup.py.
(test_env) $ git clone https://github.com/behave/behave.git
Cloning into 'behave'...
remote: Reusing existing pack: 4350, done.
remote: Total 4350 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (4350/4350), 1.85 MiB | 418.00 KiB/s, done.
Resolving deltas: 100% (2388/2388), done.
Checking connectivity... done.
نحن نتصرف setup.py
في /tmp/behave
:
(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
تثبيت حزمة بيثون من repo git(test_env) $ cd /tmp/behave && pip install .
running install
...
Installed /private/tmp/test_env/lib/python2.7/site-packages/enum34-1.0-py2.7.egg
Finished processing dependencies for behave==1.2.5a1
إذا قمنا بتشغيل الحل المذكور /tmp
>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['behave==1.2.5a1', 'enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp'
إذا قمنا بتشغيل الحل المذكور /tmp/behave
>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp/behave'
behave==1.2.5a1
مفقود من الأمثلة الثانية، لأن دليل العمل يحتوي behave
'س setup.py
ملف.
لم أجد أي إشارة إلى هذه المشكلة في الوثائق. ربما سأفتح خطأ لذلك.
نصائح أخرى
help('modules')
في قذيفة بيثون / موجه.
الآن، هذه الأساليب حاولت نفسي، وحصلت على ما تم الإعلان عنه بالضبط: جميع الوحدات النمطية.
للأسف، أنت حقا لا تهتم كثيرا في Stdlib، أنت تعرف ما تحصل عليه مع تثبيت بيثون.
حقا، أريد الاشياء التي أنا المثبتة.
ما في الواقع، من المستغرب أن يعمل على ما يرام هو:
pip freeze
التي عاد:
Fabric==0.9.3
apache-libcloud==0.4.0
bzr==2.3b4
distribute==0.6.14
docutils==0.7
greenlet==0.3.1
ipython==0.10.1
iterpipes==0.4
libxml2-python==2.6.21
أقول "بشكل مدهش" لأن أداة تثبيت الحزمة هي المكان الدقيق الذي يتوقعه المرء العثور على هذه الوظيفة، على الرغم من أنه ليس تحت اسم "تجميد" ولكن التعبئة والتغليف بيثون غريبة للغاية، وأنا أشعر بالغة أن هذه الأداة منطقية. PIP 0.8.2، بيثون 2.7.
في
ipython
يمكنك كتابة "import
فاتورة غير مدفوعة".في مترجم الثعبان القياسي، يمكنك كتابة "
help('modules')
".في سطر الأوامر، يمكنك استخدام
pydoc
modules
.في النص، اتصل
pkgutil.iter_modules()
.
منذ PIP الإصدار 1.3، لديك الوصول إلى:
pip list
الذي يبدو أن السكر النحوي ل "بيب تجميد". ستقوم بإدراج جميع الوحدات النمطية الخاصة بتثبيتك أو Virtualenv، إلى جانب أرقام الإصدار الخاصة بها. لسوء الحظ، لا يعرض رقم الإصدار الحالي من أي وحدة نمطية، ولا يغسل أطباقك أو تألق حذائك.
أنا فقط استخدم هذا لرؤية الوحدات المستخدمة حاليا:
import sys as s
s.modules.keys()
مما يدل على جميع الوحدات التي تعمل على ثعبانك.
لجميع الوحدات المدمجة استخدام:
s.modules
وهو محترف يحتوي على جميع الوحدات والاستيراد كائنات.
في قذيفة عادية فقط استخدام
pydoc modules
اعتبارا من PIP 10، لن تعمل الإجابة المقبولة. قام فريق التطوير بإزالة الوصول إلى get_installed_distributions
نمط. هناك وظيفة بديلة في setuptools
لفعل نفس الشيء. فيما يلي نسخة بديلة تعمل مع PIP 10:
import pkg_resources
installed_packages = pkg_resources.working_set
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
for i in installed_packages])
print(installed_packages_list)
واسمحوا لي أن أعرف ما إذا كان سيتم أو لن تعمل في الإصدارات السابقة من PIP، أيضا.
إذا كنا نحتاج إلى سرد الحزم المثبتة في قذيفة بيثون، فيمكننا استخدام help
الأمر كما يلي
>>help('modules package')
أنا عادة استخدام pip list
للحصول على قائمة الحزم (مع الإصدار).
هذا يعمل في بيئة افتراضية أيضا، بالطبع. لإظهار ما هو مثبت في البيئة الافتراضية فقط (وليس الحزم العالمية)، استخدم pip list --local
.
هنا وثائق تظهر كل المتاحة pip list
خيارات، مع العديد من الأمثلة الجيدة.
البحث بسيط جدا باستخدام pkgutil.iter_modules.
from pkgutil import iter_modules
a=iter_modules()
while True:
try: x=a.next()
except: break
if 'searchstr' in x[1]: print x[1]
ركضت في مخصص مثبت Python 2.7 على نظام التشغيل X. إنه مطلوب X11 لإدراج الوحدات النمطية المثبتة (كلاهما باستخدام المساعدة و pydoc).
لتكون قادرا على سرد جميع الوحدات النمطية دون تثبيت X11 ركضت Pydoc كخادم HTTP، أي:
pydoc -p 12345
ثم من الممكن توجيه رحلات السفاري إلى http://localhost:12345/
لرؤية جميع الوحدات النمطية.
على ويندوز، أدخل هذا في CMD
c:\python\libs>python -m pip freeze
وكان هذا مستوحى من آدم ماتان إجابه (المقبول واحد):
import tabulate
try:
from pip import get_installed_distributions
except:
from pip._internal.utils.misc import get_installed_distributions
tabpackages = []
for _, package in sorted([('%s %s' % (i.location, i.key), i) for i in get_installed_distributions()]):
tabpackages.append([package.location, package.key, package.version])
print(tabulate.tabulate(tabpackages))
الذي يطبع بعد ذلك جدول في شكل
19:33 pi@rpi-v3 [iot-wifi-2] ~/python$ python installed_packages.py
------------------------------------------- -------------- ------
/home/pi/.local/lib/python2.7/site-packages enum-compat 0.0.2
/home/pi/.local/lib/python2.7/site-packages enum34 1.1.6
/home/pi/.local/lib/python2.7/site-packages pexpect 4.2.1
/home/pi/.local/lib/python2.7/site-packages ptyprocess 0.5.2
/home/pi/.local/lib/python2.7/site-packages pygatt 3.2.0
/home/pi/.local/lib/python2.7/site-packages pyserial 3.4
/usr/local/lib/python2.7/dist-packages bluepy 1.1.1
/usr/local/lib/python2.7/dist-packages click 6.7
/usr/local/lib/python2.7/dist-packages click-datetime 0.2
/usr/local/lib/python2.7/dist-packages construct 2.8.21
/usr/local/lib/python2.7/dist-packages pyaudio 0.2.11
/usr/local/lib/python2.7/dist-packages tabulate 0.8.2
------------------------------------------- -------------- ------
الذي يتيح لك بعد ذلك بسهولة تمييز الحزم التي قمت بتثبيتها sudo
.
مذكرة جانبا: لقد لاحظت أنه عندما أقوم بتثبيت حزمة مرة واحدة عبر sudo
ومرة واحدة دون، يأخذ المرء الأسبقية بحيث لا يتم إدراج المرء الآخر (موقع واحد فقط). أعتقد أنه يتم بعد ذلك إدراج واحد فقط في الدليل المحلي. هذا يمكن تحسينه.
بصرف النظر عن استخدام pip freeze
لقد تم تثبيت صفار البيض في بيئاتي الافتراضية.
- للحصول على جميع الوحدات النمطية المتاحة، تشغيل
sys.modules
- للوصول إلى الكل المثبتة الوحدات (قراءة: تثبيتها
pip
)، قد تنظر فيpip.get_installed_distributions()
للغرض الثاني، مثال الرمز:
import pip
for package in pip.get_installed_distributions():
name = package.project_name # SQLAlchemy, Django, Flask-OAuthlib
key = package.key # sqlalchemy, django, flask-oauthlib
module_name = package._get_metadata("top_level.txt") # sqlalchemy, django, flask_oauthlib
location = package.location # virtualenv lib directory etc.
version = package.version # version number
هذا الحل أساسي بناء على الوحدات النمطية importlib
و pkgutil
والعمل مع Cpython 3.4 و Cpython 3.5، ولكن ليس لديه دعم ل CPYTHON 2.
تفسير
sys.builtin_module_names
- أسماء جميع الوحدات المدمجة (انظر جوابي هنا)pkgutil.iter_modules()
- إرجاع معلومات حول جميع الوحدات النمطية المتاحةimportlib.util.find_spec()
- إرجاع معلومات حول وحدة الاستيراد، إذا كان موجوداBuiltinImporter
- مستورد وحدات مدمجة (مستندات)SourceFileLoader
- مستورد لنبلات بيثون القياسية (بشكل افتراضي لديه امتداد * .py) (مستندات)ExtensionFileLoader
- مستورد للوحدات مكتبة مشتركة (مكتوبة على C أو C ++)
الكود الكامل
import sys
import os
import shutil
import pkgutil
import importlib
import collections
if sys.version_info.major == 2:
raise NotImplementedError('CPython 2 is not supported yet')
def main():
# name this file (module)
this_module_name = os.path.basename(__file__).rsplit('.')[0]
# dict for loaders with their modules
loaders = collections.OrderedDict()
# names`s of build-in modules
for module_name in sys.builtin_module_names:
# find an information about a module by name
module = importlib.util.find_spec(module_name)
# add a key about a loader in the dict, if not exists yet
if module.loader not in loaders:
loaders[module.loader] = []
# add a name and a location about imported module in the dict
loaders[module.loader].append((module.name, module.origin))
# all available non-build-in modules
for module_name in pkgutil.iter_modules():
# ignore this module
if this_module_name == module_name[1]:
continue
# find an information about a module by name
module = importlib.util.find_spec(module_name[1])
# add a key about a loader in the dict, if not exists yet
loader = type(module.loader)
if loader not in loaders:
loaders[loader] = []
# add a name and a location about imported module in the dict
loaders[loader].append((module.name, module.origin))
# pretty print
line = '-' * shutil.get_terminal_size().columns
for loader, modules in loaders.items():
print('{0}\n{1}: {2}\n{0}'.format(line, len(modules), loader))
for module in modules:
print('{0:30} | {1}'.format(module[0], module[1]))
if __name__ == '__main__':
main()
الاستعمال
ل CPYTHON3.5 (اقتطاع)
$ python3.5 python_modules_info.py
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
30: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast | built-in
_codecs | built-in
_collections | built-in
_functools | built-in
_imp | None
_io | built-in
_locale | built-in
_operator | built-in
_signal | built-in
_sre | built-in
_stat | built-in
_string | built-in
_symtable | built-in
_thread | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
227: <class '_frozen_importlib_external.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__ | /usr/local/lib/python3.5/__future__.py
_bootlocale | /usr/local/lib/python3.5/_bootlocale.py
_collections_abc | /usr/local/lib/python3.5/_collections_abc.py
_compat_pickle | /usr/local/lib/python3.5/_compat_pickle.py
_compression | /usr/local/lib/python3.5/_compression.py
_dummy_thread | /usr/local/lib/python3.5/_dummy_thread.py
_markupbase | /usr/local/lib/python3.5/_markupbase.py
_osx_support | /usr/local/lib/python3.5/_osx_support.py
_pydecimal | /usr/local/lib/python3.5/_pydecimal.py
_pyio | /usr/local/lib/python3.5/_pyio.py
_sitebuiltins | /usr/local/lib/python3.5/_sitebuiltins.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
64: <class '_frozen_importlib_external.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bisect | /usr/local/lib/python3.5/lib-dynload/_bisect.cpython-35m-x86_64-linux-gnu.so
_bz2 | /usr/local/lib/python3.5/lib-dynload/_bz2.cpython-35m-x86_64-linux-gnu.so
_codecs_cn | /usr/local/lib/python3.5/lib-dynload/_codecs_cn.cpython-35m-x86_64-linux-gnu.so
_codecs_hk | /usr/local/lib/python3.5/lib-dynload/_codecs_hk.cpython-35m-x86_64-linux-gnu.so
_codecs_iso2022 | /usr/local/lib/python3.5/lib-dynload/_codecs_iso2022.cpython-35m-x86_64-linux-gnu.so
(****************************truncated*******************************)
ل CPYTHON3.4 (مبتأ)
$ python3.4 python_modules_info.py
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
54: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast | built-in
_bisect | built-in
_codecs | built-in
_collections | built-in
_datetime | built-in
_elementtree | built-in
_functools | built-in
_heapq | built-in
_imp | None
_io | built-in
_locale | built-in
_md5 | built-in
_operator | built-in
_pickle | built-in
_posixsubprocess | built-in
_random | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
246: <class '_frozen_importlib.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__ | /usr/lib/python3.4/__future__.py
_bootlocale | /usr/lib/python3.4/_bootlocale.py
_collections_abc | /usr/lib/python3.4/_collections_abc.py
_compat_pickle | /usr/lib/python3.4/_compat_pickle.py
_dummy_thread | /usr/lib/python3.4/_dummy_thread.py
_markupbase | /usr/lib/python3.4/_markupbase.py
_osx_support | /usr/lib/python3.4/_osx_support.py
_pyio | /usr/lib/python3.4/_pyio.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
44: <class '_frozen_importlib.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bz2 | /usr/lib/python3.4/lib-dynload/_bz2.cpython-34m-x86_64-linux-gnu.so
_codecs_cn | /usr/lib/python3.4/lib-dynload/_codecs_cn.cpython-34m-x86_64-linux-gnu.so
_codecs_hk | /usr/lib/python3.4/lib-dynload/_codecs_hk.cpython-34m-x86_64-linux-gnu.so
_codecs_iso2022 | /usr/lib/python3.4/lib-dynload/_codecs_iso2022.cpython-34m-x86_64-linux-gnu.so
_codecs_jp | /usr/lib/python3.4/lib-dynload/_codecs_jp.cpython-34m-x86_64-linux-gnu.so
_codecs_kr | /usr/lib/python3.4/lib-dynload/_codecs_kr.cpython-34m-x86_64-linux-gnu.so
_codecs_tw | /usr/lib/python3.4/lib-dynload/_codecs_tw.cpython-34m-x86_64-linux-gnu.so
_crypt | /usr/lib/python3.4/lib-dynload/_crypt.cpython-34m-x86_64-linux-gnu.so
(****************************truncated*******************************)
في حال كان لديك أناسوندا بايثون توزيع تثبيت، يمكنك أيضا استخدام
$conda list
بالإضافة إلى الحلول الموصوفة أعلاه.
بيب تجميد هل كل شيء العثور على الحزم ولكن يمكن للمرء ببساطة كتابة الأمر التالي لسرد جميع المسارات حيث توجد حزم بيثون.
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
هناك العديد من الأفكار، في البداية أفكر في هذين:
باص
سلبيات: غير مثبتة دائما
مساعدة ("وحدات")
سلبيات: الإخراج إلى وحدة التحكم؛ مع وحدات مكسورة (انظر Ubuntu ...) يمكن segfault
أحتاج إلى نهج سهل، باستخدام المكتبات الأساسية ومتوافقة مع Python 2.x القديم
وأرى النور: listModules.py.
مخفية في دليل مصدر الوثائق في 2.5 هو برنامج نصي صغير يسرد جميع الوحدات النمطية المتاحة لتثبيت Python.
الايجابيات:
يستخدم فقط Imp، SYS، OS، RE، الوقت
مصممة لتشغيل على python 1.5.2 والأحدث
رمز المصدر مضغوط حقا، حتى تتمكن من العبث بسهولة، على سبيل المثال لتمرير قائمة استثناء من وحدات عربات التي تجرها الدواب (لا تحاول استيرادها)
هناك العديد من الطرق إلى الجلد القط.
الطريقة الأكثر بسيطة هي استخدام
pydoc
وظيفة مباشرة من قذيفة مع:
pydoc modules
ولكن لمزيد من المعلومات، استخدم الأداة التي تسمى تاريخ هذا أيضا اقول لك تواريخ التثبيت.
pip install pip-date
جرب هذا
pip list
أو
pip freeze
كنت بحاجة للعثور على الإصدار المحدد من الحزم المتوفرة افتراضيا في AWS Lambda. فعلت ذلك مع مزج الأفكار من هذه الصفحة. أنا أتقاسمها للأجيال القادمة.
import pkgutil
__version__ = '0.1.1'
def get_ver(name):
try:
return str(__import__(name).__version__)
except:
return None
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': [{
'path': m.module_finder.path,
'name': m.name,
'version': get_ver(m.name),
} for m in list(pkgutil.iter_modules())
#if m.module_finder.path == "/var/runtime" # Uncomment this if you only care about a certain path
],
}
ما اكتشفته هو أن مكتبة Boto3 المقدمة كانت قديمة وقد لم تكن خطري أن رمزي فشل. أنا فقط بحاجة إلى إضافة Boto3 والبوتيكوري إلى مشروعي. ولكن بدون هذا كنت سأقاضي رأسي رأيي كان رمز بلدي كان سيئا.
{
"statusCode": 200,
"body": [
{
"path": "/var/task",
"name": "lambda_function",
"version": "0.1.1"
},
{
"path": "/var/runtime",
"name": "bootstrap",
"version": null
},
{
"path": "/var/runtime",
"name": "boto3",
"version": "1.9.42"
},
{
"path": "/var/runtime",
"name": "botocore",
"version": "1.12.42"
},
{
"path": "/var/runtime",
"name": "dateutil",
"version": "2.7.5"
},
{
"path": "/var/runtime",
"name": "docutils",
"version": "0.14"
},
{
"path": "/var/runtime",
"name": "jmespath",
"version": "0.9.3"
},
{
"path": "/var/runtime",
"name": "lambda_runtime_client",
"version": null
},
{
"path": "/var/runtime",
"name": "lambda_runtime_exception",
"version": null
},
{
"path": "/var/runtime",
"name": "lambda_runtime_marshaller",
"version": null
},
{
"path": "/var/runtime",
"name": "s3transfer",
"version": "0.1.13"
},
{
"path": "/var/runtime",
"name": "six",
"version": "1.11.0"
},
{
"path": "/var/runtime",
"name": "test_bootstrap",
"version": null
},
{
"path": "/var/runtime",
"name": "test_lambda_runtime_client",
"version": null
},
{
"path": "/var/runtime",
"name": "test_lambda_runtime_marshaller",
"version": null
},
{
"path": "/var/runtime",
"name": "urllib3",
"version": "1.24.1"
},
{
"path": "/var/lang/lib/python3.7",
"name": "__future__",
"version": null
},
...
ما اكتشفته كان مختلفا أيضا عن ما ينشرون رسميا. وبعد في وقت كتابة هذا:
- نظام التشغيل - أمازون لينكس
- AMI - AMZN-AMI-HVM-2017.03.1.20170812-X86_64-GP2
- Linux Kernel - 4.14.77-70.59.amzn1.x86_64
- AWS SDK ل JavaScript - 2.290.0
- SDK ل Python (بوتو 3) - 3-1.74 Botocore-1.10.74
لأي شخص يتساءل كيفية الاتصال pip list
من برنامج Python، يمكنك استخدام ما يلي:
import pip
pip.main(['list]) # this will print all the packages
هذا سيساعد
في المحطة أو ipython، اكتب:
help('modules')
ومن بعد
In [1]: import #import press-TAB
Display all 631 possibilities? (y or n)
ANSI audiodev markupbase
AptUrl audioop markupsafe
ArgImagePlugin avahi marshal
BaseHTTPServer axi math
Bastion base64 md5
BdfFontFile bdb mhlib
BmpImagePlugin binascii mimetools
BufrStubImagePlugin binhex mimetypes
CDDB bisect mimify
CDROM bonobo mmap
CGIHTTPServer brlapi mmkeys
Canvas bsddb modulefinder
CommandNotFound butterfly multifile
ConfigParser bz2 multiprocessing
ContainerIO cPickle musicbrainz2
Cookie cProfile mutagen
Crypto cStringIO mutex
CurImagePlugin cairo mx
DLFCN calendar netrc
DcxImagePlugin cdrom new
Dialog cgi nis
DiscID cgitb nntplib
DistUpgrade checkbox ntpath
من قذيفة
ls site-packages
إذا لم يكن هذا مفيدا، يمكنك القيام بذلك.
import sys
import os
for p in sys.path:
print os.listdir( p )
ونرى ما ينتج.