我如何获得本地安装的Python模块列表?
我想获得Python模块的列表,这些模块位于我的Python安装(UNIX服务器)中。
如何获得计算机中安装的Python模块列表?
解
我从Python脚本中得到一个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)
作为(太长)一个class轮:
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']
范围
此解决scheme适用于系统范围或虚拟环境范围,并涵盖由setuptools
, pip
和( god forbid ) easy_install
安装的软件包。
我的用例
我把这个调用的结果添加到我的烧瓶服务器,所以当我用http://example.com/exampleServer/environment
调用它的时候,我得到了安装在服务器的virtualenv上的软件包列表。 它使debugging变得更容易。
注意事项
我已经注意到这种技术的一个奇怪的行为 – 当Python解释器在与setup.py
文件相同的目录中被调用时,它没有列出由setup.py
安装的包。
重现步骤:
创build一个虚拟环境
$ 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
克隆一个git 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.
在/tmp/behave
我们的行为是setup.py
:
(test_env) $ ls /tmp/behave/setup.py /tmp/behave/setup.py
从git仓库安装python包
(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
运行上述解决scheme
>>> 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
运行上述解决scheme
>>> 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')
在Python shell /提示符下。
现在,我尝试了自己的这些方法,并且得到了广告的所有模块。
唉,你真的不关心stdlib,你知道你用python安装得到什么。
真的,我想要我安装的东西。
其实,令人惊讶的是,工作得很好:
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
我说“令人惊讶”,因为软件包安装工具是人们期望能够find这个function的确切位置,虽然不是名字“冻结”,但是python包装太奇怪了,我对这个工具是有道理的大惊小怪。 Pip 0.8.2,Python 2.7。
-
在
ipython
你可以input“import
tab ”。 -
在标准的Python解释器中,你可以input“
help('modules')
”。 -
在命令行中,您可以使用
pydoc
modules
。 -
在脚本中,调用
pkgutil.iter_modules()
。
从PIP版本1.3开始,你可以访问:
pip list
这似乎是“点冻结”的语法糖。 它将列出所有特定于您的安装或virtualenv的模块及其版本号。 不幸的是,它不显示任何模块的当前版本号,也不会洗碗或擦鞋。
在正常的shell只是使用
pydoc modules
我只是用它来看当前使用的模块:
import sys as s s.modules.keys()
它显示了你的python上运行的所有模块。
对于所有内置模块使用:
s.modules
这是一个包含所有模块和导入对象的字典。
如果我们需要知道Python中已安装的软件包列表,我们可以使用下面给出的'help'命令(在python shell中)
>>help('modules package')
我遇到了一个自定义安装在OS X上的python 2.7。它需要X11列出已安装的模块(使用帮助和pydoc)。
为了能够列出所有模块而不安装X11我运行pydoc作为http-server,即:
pydoc -p 12345
然后可以将Safari导向到http://localhost:12345/
来查看所有模块。
使用pkgutil.iter_modules进行非常简单的search
from pkgutil import iter_modules a=iter_modules() while True: try: x=a.next() except: break if 'searchstr' in x[1]: print x[1]
除了使用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
在Windows上,input这个cmd
c:\python\libs>python -m pip freeze
此解决scheme主要基于模块importlib
和pkgutil
并与CPython 3.4和CPython 3.5一起使用,但不支持CPython 2。
说明
-
sys.builtin_module_names
– 命名所有内置模块(看我的答案) -
pkgutil.iter_modules()
– 返回关于所有可用模块的信息 -
importlib.util.find_spec()
– 返回关于导入模块的信息(如果存在) -
BuiltinImporter
– 内置模块的导入器( docs ) -
SourceFileLoader
– 标准Python模块的导入器(默认情况下扩展名为* .py)( docs ) -
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*******************************)
如果你安装了anaconda python发行版 ,你也可以使用
$conda list
除了上述的解决scheme之外。
点击冻结这一切都find包但是可以简单地写下面的命令来列出所有Python包的path。
>>> import site; site.getsitepackages() ['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
从壳
ls site-packages
如果这没有帮助,你可以这样做。
import sys import os for p in sys.path: print os.listdir( p )
看看产生了什么。