问题:如何获取本地安装的Python模块列表?
我想获得Python模块的列表,这些模块在我的Python安装(UNIX服务器)中。
如何获得计算机中安装的Python模块的列表?
回答 0
解
不要使用pip> 10.0!
我pip freeze
从Python脚本中获得类似列表的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
以及(但愿)easy_install
。
我的用例
我将此调用的结果添加到了我的Flask服务器中,所以当我用它调用它时,http://example.com/exampleServer/environment
我会获得服务器的virtualenv上安装的软件包的列表。它使调试变得非常容易。
注意事项
我注意到这种技术的奇怪行为-当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) $
克隆一个git repo 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
从git repo安装python包
(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
文件。
我在文档中找不到对该问题的任何引用。也许我会为此打开一个错误。
回答 1
help('modules')
在Python Shell /提示中。
回答 2
现在,我尝试了这些方法,并且得到了所宣传的内容:所有模块。
las,真的,您对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
我之所以说“令人惊讶”,是因为软件包安装工具是人们期望找到该功能的确切位置,尽管它的名称不是“ freeze”,但python打包却很奇怪,令我感到惊讶的是,这个工具很有意义。点0.8.2,Python 2.7。
回答 3
从pip 1.3版开始,您可以访问:
pip list
这似乎是“点子冻结”的语法糖。它将列出特定于您的安装或virtualenv的所有模块,以及它们的版本号。不幸的是,它没有显示任何模块的当前版本号,也没有洗碗或擦鞋。
回答 4
在其中
ipython
可以输入“import
Tab”。在标准的Python解释器中,您可以输入“
help('modules')
”。在命令行上,您可以使用。
pydoc
modules
在脚本中,调用
pkgutil.iter_modules()
。
回答 5
我只是用它来查看当前使用的模块:
import sys as s
s.modules.keys()
显示所有在python上运行的模块。
对于所有内置模块,请使用:
s.modules
这是一个包含所有模块和导入对象的字典。
回答 6
在普通外壳中使用
pydoc modules
回答 7
从第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中起作用。
回答 8
如果我们需要在Python Shell中列出已安装的软件包,则可以使用以下help
命令
>>help('modules package')
回答 9
我通常使用pip list
来获取软件包列表(带有版本)。
当然,这也可以在虚拟环境中工作。要显示仅在虚拟环境中安装的内容(而不是全局软件包),请使用pip list --local
。
这里的文档显示了所有可用的pip list
选项,并提供了一些很好的示例。
回答 10
使用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]
回答 11
在Windows上,以cmd输入
c:\python\libs>python -m pip freeze
回答 12
我在OS X上遇到了一个自定义安装的python 2.7。它需要X11列出安装的模块(都使用help和pydoc)。
为了能够列出所有模块而不安装X11,我将pydoc作为http-server运行,即:
pydoc -p 12345
然后,可以指示Safari http://localhost:12345/
浏览所有模块。
回答 13
试试这些
pip list
要么
pip freeze
回答 14
这会有所帮助
在终端或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
回答 15
该解决方案主要基于模块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*******************************)
回答 16
警告:亚当·马坦(Adam Matan)不建议在点> 10.0的情况下使用此方法。另外,请在下面阅读@sinoroc的评论
这是受到亚当·马坦(Adam Matan)的回答(公认的)的启发:
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
,一个优先处理,这样就不会列出另一个数据包(仅显示一个位置)。我相信只会列出本地目录中的一个。这可以改善。
回答 17
除了使用之外,pip freeze
我还在虚拟环境中安装了蛋黄。
回答 18
回答 19
- 获取所有可用的模块,运行
sys.modules
- 要获取所有已安装的模块(请阅读:由by安装
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
回答 20
对于最新版本,例如Pip 20
在您的python编辑器或IPython中运行以下命令
import pkg_resources;
installed_packages = {d.project_name: d.version for d in pkg_resources.working_set}
print(installed_packages)
阅读其他答案并组合在一起,这是Python中最快,最简单的组合
回答 21
pip Frozen完成了所有查找程序包的工作,但是只需编写以下命令即可列出python程序包所在的所有路径。
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
回答 22
有很多方法可以给猫皮。
最简单的方法是
pydoc
直接在shell中使用以下功能:pydoc modules
但是,有关更多信息,请使用名为pip-date的工具,该工具还会告诉您安装日期。
pip install pip-date
回答 23
有很多想法,最初我会考虑以下两个方面:
点子
缺点:并非总是安装
帮助(’模块’)
缺点:输出到控制台;带有损坏的模块(请参见ubuntu …)会导致segfault
我需要一个简单的方法,使用基本库并与旧python 2.x兼容
我看到了光:listmodules.py
2.5的文档源目录中隐藏着一个小脚本,该脚本列出了Python安装的所有可用模块。
优点:
仅使用imp,sys,os,re,time
设计用于在Python 1.5.2和更高版本上运行
源代码确实非常紧凑,因此您可以轻松修改它,例如,传递错误模块的异常列表(不要尝试导入它们)
回答 24
我需要找到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和botocore。但是如果没有这个,我本来会以为我的代码很糟糕而ing之以鼻。
{
"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
},
...
我发现的内容也与他们正式发布的内容不同。在撰写本文时:
- 操作系统– Amazon Linux
- AMI – amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
- Linux内核– 4.14.77-70.59.amzn1.x86_64
- 适用于JavaScript的AWS开发工具包– 2.290.0 \
- 适用于Python的SDK(Boto 3)– 3-1.7.74 botocore-1.10.74
回答 25
安装
pip install pkgutil
码
import pkgutil
for i in pkgutil.iter_modules(None): # returns a tuple (path, package_name, ispkg_flag)
print(i[1]) #or you can append it to a list
样本输出:
multiprocessing
netrc
nntplib
ntpath
nturl2path
numbers
opcode
pickle
pickletools
pipes
pkgutil
回答 26
这是一个python代码解决方案,它将返回已安装模块的列表。可以轻松地修改代码以包含版本号。
import subprocess
import sys
from pprint import pprint
installed_packages = reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze']).decode('utf-8')
installed_packages = installed_packages.split('\r\n')
installed_packages = [pkg.split('==')[0] for pkg in installed_packages if pkg != '']
pprint(installed_packages)
回答 27
对于想知道如何pip list
从Python程序调用的任何人,可以使用以下命令:
import pip
pip.main(['list]) # this will print all the packages
回答 28
从外壳
ls site-packages
如果那没有帮助,则可以执行此操作。
import sys
import os
for p in sys.path:
print os.listdir( p )
看看会产生什么。