python - मैं स्थानीय रूप से स्थापित पायथन मॉड्यूल की सूची कैसे प्राप्त कर सकता हूं?




module pip (12)

उपाय

पाइथन स्क्रिप्ट से एक pip freeze -जैसी सूची प्राप्त करने के लिए मेरे 50 सेंट:

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 और ( god setuptools ) easy_install द्वारा स्थापित संकुल को कवर करता है।

मेरा उपयोग मामला

मैंने इस कॉल का परिणाम मेरे फ्लास्क सर्वर पर जोड़ा, इसलिए जब मैं इसे http://example.com/exampleServer/environment साथ कॉल करता हूं तो मुझे सर्वर के वर्चुअलएन्व पर स्थापित संकुलों की सूची मिलती है। यह एक बहुत आसान आसान डीबगिंग बनाता है।

चेतावनियां

मैंने इस तकनीक का एक अजीब व्यवहार देखा है - जब Python दुभाषिया को 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
गिट रेपो से पायथन पैकेज स्थापित करें
(test_env) $ cd /tmp/behave && python setup.py 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 से चलाते /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 फ़ाइल है।

मुझे दस्तावेज़ में इस मुद्दे का कोई संदर्भ नहीं मिला। शायद मैं इसके लिए एक बग खोलूंगा।

मैं पाइथन मॉड्यूल की एक सूची प्राप्त करना चाहता हूं, जो कि मेरे पायथन इंस्टॉलेशन (यूनिक्स सर्वर) में हैं।

आप अपने कंप्यूटर में स्थापित पायथन मॉड्यूल की एक सूची कैसे प्राप्त कर सकते हैं?


  1. सभी उपलब्ध मॉड्यूल प्राप्त करने के लिए sys.modules
  2. सभी स्थापित मॉड्यूल प्राप्त करने के लिए (पढ़ें: 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

अब, मैंने इन तरीकों से खुद को कोशिश की, और मुझे बिल्कुल वही मिला जो विज्ञापन दिया गया था: सभी मॉड्यूल।

हां, वास्तव में आप 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

मैं "आश्चर्यजनक रूप से" कहता हूं क्योंकि पैकेज इंस्टॉल टूल एक सटीक स्थान है जहां कोई इस कार्यक्षमता को ढूंढने की उम्मीद करेगा, हालांकि 'फ्रीज' नाम के तहत नहीं, लेकिन पायथन पैकेजिंग इतनी अजीब है कि मुझे यह पता चला है कि यह टूल समझ में आता है। पिप 0.8.2, पायथन 2.7।


खोल से

ls site-packages

यदि यह सहायक नहीं है, तो आप यह कर सकते हैं।

import sys
import os
for p in sys.path:
    print os.listdir( p )

और देखें कि क्या उत्पादन करता है।


पीआईपी संस्करण 1.3 के बाद से, आपको इस तक पहुंच प्राप्त हुई है:

pip list

जो "पीआईपी फ्रीज" के लिए वाक्य रचनात्मक चीनी प्रतीत होता है। यह आपके संस्करण संख्याओं के साथ-साथ आपके इंस्टॉलेशन या वर्चुअलएन्व के सभी मॉड्यूल सूचीबद्ध करेगा। दुर्भाग्यवश यह किसी भी मॉड्यूल के वर्तमान संस्करण संख्या को प्रदर्शित नहीं करता है, न ही यह आपके व्यंजन धोता है या आपके जूते चमकता है।


मैं ओएस एक्स पर एक कस्टम स्थापित पायथन 2.7 में भाग गया। इसे स्थापित मॉड्यूल सूचीबद्ध करने के लिए एक्स 11 की आवश्यकता थी (दोनों मदद और पायडोक का उपयोग कर)।

X11 इंस्टॉल किए बिना सभी मॉड्यूल सूचीबद्ध करने में सक्षम होने के लिए मैंने http-server के रूप में pydoc चलाया, यानी:

pydoc -p 12345

फिर सफारी को http://localhost:12345/ सभी मॉड्यूल देखने के लिए निर्देशित करना संभव है।


यदि आपके पास एनाकोंडा पायथन वितरण स्थापित है, तो आप इसका भी उपयोग कर सकते हैं

$conda list

ऊपर वर्णित समाधान के अलावा।


यह समाधान मॉड्यूल importlib और pkgutil पर आधारित है और pkgutil 3.4 और सीपीथन 3.5 के साथ काम करता है, लेकिन pkgutil 2 के लिए इसका कोई समर्थन नहीं है।

व्याख्या

  1. sys.builtin_module_names - सभी अंतर्निहित मॉड्यूल नाम ( here मेरा जवाब देखें)
  2. pkgutil.iter_modules() - सभी उपलब्ध मॉड्यूल के बारे में एक जानकारी देता है
  3. importlib.util.find_spec() - मौजूद होने पर मॉड्यूल आयात करने के बारे में एक जानकारी देता है
  4. BuiltinImporter आयातक - अंतर्निहित मॉड्यूल ( docs ) के लिए एक आयातक
  5. SourceFileLoader - एक मानक पायथन मॉड्यूल के लिए एक आयातक (डिफ़ॉल्ट रूप से एक्सटेंशन * .py है) ( docs )
  6. ExtensionFileLoader - साझा लाइब्रेरी के रूप में मॉड्यूल के लिए एक आयातक (सी या सी ++ पर लिखा गया)

पूरा कोड

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*******************************)

सामान्य खोल में बस उपयोग करें

pydoc modules

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]

पाइप फ्रीज यह सब संकुल ढूंढता है हालांकि कोई भी पाइथन पैकेज वाले सभी पथों को सूचीबद्ध करने के लिए निम्न आदेश लिख सकता है।

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

help('modules')

एक पायथन खोल / प्रॉम्प्ट में।





pip