如何获取本地安装的Python模块列表?


996

我想获得Python模块的列表,这些模块在我的Python安装(UNIX服务器)中。

如何获得计算机中安装的Python模块的列表?


77
您可以执行>>> help(),然后>>> modules
Julius Naeumann

1
还有其他选择吗?help()为我挂起。
Paulo Carvalho

2
这些答案中有很多都假设您可以访问命令行。如果您使用的是AWS Lambda,则必须在Python内部完成所有操作。请参阅stackoverflow.com/a/54939905/117471
Bruno Bronosky,

Answers:


610

不要使用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']

范围

该解决方案适用于系统范围或到虚拟环境范围,和封面封装安装通过setuptoolspip以及(但愿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第二个示例中缺少,因为工作目录包含behavesetup.py文件。

我在文档中找不到对该问题的任何引用。也许我会为此打开一个错误。


5
感谢您的回答!我认为它更好地回答了这个问题,因为我询问“本地”安装的Python模块。冻结点也不总是要走的路。这样效果更好-我认为。
莱奥波德·赫兹(LéoLéopoldHertz)2014年

3
@Masi刚刚添加了此解决方案警告的详细说明。确实是一个奇怪的人。
亚当·马坦

21
另一种选择:import pkg_resources; installed_packages = [(d.project_name, d.version) for d in pkg_resources.working_set]
ebolyen

14
从第10点开始,此答案将不再有效。@ebolyen的注释显示了有效的替代命令。我得出了相同的结论,并在下面发布了完整的修订代码。
Big_Al_Tx

5
在最新版本的pip中,此操作无效,并显示一条错误消息“” AttributeError: module 'pip' has no attribute 'get_installed_distributions'
HelloGoodbye


285

现在,我尝试了这些方法,并且得到了所宣传的内容:所有模块。

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。


4
我想这个名称的意思是,您会获得当前安装内容的“冻结”快照,以后可以将其反馈到pip中,以获取与安装在不同环境中完全相同的模块。
瑞安·汤普森

Arash,您也可以在Windows中安装pip!首先安装setuptools,然后使用easy_install安装pip :)
gawbul 2012年

这很棒,但是似乎错过了我安装的某些库。例如,它没有列出PyQt。
Junuxx 2012年

8
从pip 1.3开始,有list命令。
Piotr Dobrogost 2013年

有用。真是一团糟的蟒蛇。他们为什么不能团结起来,提出与Rails中类似的解决方案?(Gemfile,bundler,rvm)
Dimitris

106

从pip 1.3版开始,您可以访问:

pip list

这似乎是“点子冻结”的语法糖。它将列出特定于您的安装或virtualenv的所有模块,以及它们的版本号。不幸的是,它没有显示任何模块的当前版本号,也没有洗碗或擦鞋。


4
这里还讨论了与全局站点程序包pip list --local之间的区别。virtualenv
Ioannis Filippidis 2014年

1
到目前为止最好的。它还会检索版本。
aerijman

pip list是最简单和最好的。以下是选项和详细信息。

86
  • 在其中ipython可以输入“ importTab”。

  • 在标准的Python解释器中,您可以输入“ help('modules')”。

  • 在命令行上,您可以使用。pydoc modules

  • 在脚本中,调用pkgutil.iter_modules()


5
pkgutil.iter_modules()可以,上面的pip解决方案不会列出所有软件包,仅列出通过pip安装的软件包。
metaperture,2014年

2
太棒了!自从提出问题以来,我认为他们已经改进了文档。pydoc modules spam搜索模块文档中的垃圾邮件。最后一点似乎为您提供了使用该模块的足够信息。@metaperture请举个例子,说明如何通过pkgutil.iter_modules()列出所有安装的本地模块(而不是help('modules')列出的大量stlib列表
莱奥波德·赫兹(LéoLéopoldHertz)2014年

2
@LéoLéopoldHertz준영尝试以下片段:python -c 'import pkgutil;print [x[1] for x in list(pkgutil.iter_modules())]'。它应该将所有模块名称转储为一个很大的Python列表。该x[1]位用于从生成的元组中抽取模块名称pkgutil.iter_modules()
菲利普·康拉德

76

我只是用它来查看当前使用的模块:

import sys as s
s.modules.keys()

显示所有在python上运行的模块。

对于所有内置模块,请使用:

s.modules

这是一个包含所有模块和导入对象的字典。


2
#导入sys“将sys导入为s”后,可以使用以下命令进行打印:print sys.modules.keys()
Dan Evans

不知道为什么要编辑我的帖子,但是感谢您使用我发布的信息来更正以前的帖子中的错误。如果使用help()vs help(''),将返回错误。这也适用于dir('')和sys('')等。希望这可以帮助&不会被删除。
丹·埃文斯

忽略我的上一个帖子,此帖子未编辑。我在想类似的帖子,可在这里找到: stackoverflow.com/questions/139180/…很抱歉造成混乱。
丹·埃文斯

7
推荐使用,因为这是似乎仅适用于既未安装也pydocpip安装的受限系统(本例中为NAS)的方法。
汤玛斯(Thomas)

1
与托马斯商定。例如,我使用的是repl.it,它也是一种受约束的环境。help('modules')只是挂了我没有回应。但是这种方法sys非常有效
Sergiy Kolodyazhnyy

63

在普通外壳中使用

pydoc modules

看来以上内容仅适用于'nix平台。无论如何,我都会找到并运行该脚本,并按如下所示修改命令:c:\ bin \ pythos_2.7 \ lib \ pydoc.py模块-该列表花了很长时间才建立,格式很烂,并且它忽略了已安装的版本数。我会通过。
David A. Gray,

2
@ DavidA.Gray刚刚在具有Python 3的Windows机器上尝试了此操作,并且实际上可以正常工作。使用python Windows启动器,您可以py -m pydoc modules在cmd或Powershell中进行操作。
VKK

pydoc modules在使用Python 3.6的Windows 10中对我不起作用,但是@VKK修改:py -m pydoc modules在cmd / Powershell中起作用。
马丁

41

从第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中起作用。


2
我一直在寻找这种解决方案,并竭尽全力试图找出pkg_resources。如果我可以多次投票,我会。谢谢@Big_Al_Tx!更新:除了...。当我在虚拟环境中执行“冻结冻结”并将其与该输出的输出进行比较时,缺少某些软件包。关于为什么会/将会发生任何想法?
numberwhun

@numberwhun-很高兴这为您工作。很抱歉,但是我与的差异还没有答案pip freeze。我对这个主题的了解深度有限。当所接受的答案对我不起作用时,我有点摸索无法找到解决方案,因此我尝试将其与与之相关的答案结合起来setuptools并使其生效。
Big_Al_Tx

github.com/pypa/pip/issues/5243-关于开发团队关于删除对.NET的访问的讨论get_installed_distributions routine
bl79

@ bl79-我认为这是获得参考的确切位置setuptools
Big_Al_Tx

@Big_Al_Tx:好吧,我有点绕过setuptools选项(对于我的需求来说有点模糊),我这样做了:install_pkgs = subprocess.check_output(['pip','freeze'])它确实在执行我的操作需要它来做...。
numberwhun

26

如果我们需要在Python Shell中列出已安装的软件包,则可以使用以下help命令

>>help('modules package')

22

我通常使用pip list来获取软件包列表(带有版本)。

当然,这也可以在虚拟环境中工作。要显示仅在虚拟环境中安装的内容(而不是全局软件包),请使用pip list --local

这里的文档显示了所有可用的pip list选项,并提供了一些很好的示例。


13

使用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]

有什么理由要使用while而不是for循环?我写了using for m in iter_modules(),它也确实起作用。
Joao Ponte

13

在Windows上,以cmd输入

c:\python\libs>python -m pip freeze

这对我有用:python3 -m pip Frozen-对于python 3.5.3。
dpminusa

这很好用,并且如果您定义了变量,则也不必位于libs目录中
mcy

12

我在OS X上遇到了一个自定义安装的python 2.7。它需要X11列出安装的模块(都使用help和pydoc)。

为了能够列出所有模块而不安装X11,我将pydoc作为http-server运行,即:

pydoc -p 12345

然后,可以指示Safari http://localhost:12345/浏览所有模块。



12

这会有所帮助

在终端或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

这应该是公认的答案!一线:)
AlmostPitt

9

该解决方案主要基于模块importlibpkgutil并且可以与CPython 3.4和CPython 3.5一起使用,但是不支持CPython 2。


说明

  1. sys.builtin_module_names-命名所有内置模块(在此处查看我的答案)
  2. pkgutil.iter_modules() -返回有关所有可用模块的信息
  3. importlib.util.find_spec() -返回有关导入模块的信息(如果存在)
  4. BuiltinImporter-内置模块的导入器(docs
  5. SourceFileLoader-标准Python模块的导入程序(默认扩展名为* .py)(docs
  6. 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*******************************)

能否请您比较的方法给亚当的做法在这里stackoverflow.com/a/23885252/54964
莱奥列奥波尔德·赫兹준 영

@LéoLéopoldHertz,您为什么需要它?
PADYMKO

了解您的方法比亚当的方法更好/更糟。
莱奥波德·赫兹(LéoLéopoldHertz),2017年

1
@LéoLéopoldHertz。一个简短的答案:在产品中尝试一下并自己得出结论。长答案:亚当的方法基于pip-软件包管理系统,该软件包用于安装和管理以Python编写的软件包,结果pip.get_installed_distributions()返回使用pip安装的模块。我的回答完全基于Python的标准库,涵盖了可用于导入的所有模块。最大的缺点是我的答案-不支持
CPython2。– PADYMKO

1
@LéoLéopoldHertz您误会了,它做到了。我在计算机上进行了测试。我的答案包含特殊含义**truncated**,其中输出被截断。也许您不小心,但如果不是,那么,为了给我发送有关您的系统和Python实现的信息,我将作进一步研究以修复它。
PADYMKO

9

警告:亚当·马坦(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,一个优先处理,这样就不会列出另一个数据包(仅显示一个位置)。我相信只会列出本地目录中的一个。这可以改善。


1
不,不建议这样做,请参见此处:pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program
sinoroc

1
@sinoroc感谢您指出这一点。第1点到第3点似乎不适用于此解决方案,因为此脚本的唯一目的是使用pip一次然后退出。行为可能会改变似乎是一个更大的问题。
丹尼尔·F

同意,没有公共API的原因不适用于此特定代码段。但是由于pip并不一定要保证公共API,因此可以在以后的版本中自由更改其内部API,代码结构等,就像以前已经做过的那样。这就是为什么该代码具有try / except的原因,以捕获先前的内部代码重组,该重组旨在阐明内部API是内部API而非公共API(_internal)。总而言之,它显然是有效的,但不是一个好习惯。有更好的替代方法,一些是该问题的其他答案。
sinoroc '19

1
如果“ pip”模块不存在,此脚本将无法工作。
亚历山大·斯托尔


6

如果您安装了anaconda python发行版,则也可以使用

$conda list

除了上述解决方案。


您在哪里/如何运行这条线?
HuckIt 2014年

如果您使用的是UNIX / Mac OS X计算机,请打开终端并输入conda install,它应该可以工作:)
Shreyas 2014年

我在Windows 7机器上。我实际上在路径中找到了它,但是conda.exe在AppData \ Local \ Continuum \ Anaconda \ Scripts中。
HuckIt 2014年

6
  1. 获取所有可用的模块,运行 sys.modules
  2. 要获取所有已安装的模块(请阅读:由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

sys.modules命令在最新的OSX的Python中不起作用。NameError:名称“系统”未定义
莱奥波尔德·赫兹(LéoLéopoldHertz)2014年

@Masi您是说/usr/bin/python还是来自python.org?对于前者,我可以sys.modules毫无问题地使用。
yegle 2014年

我的意思是/ usr / bin / python
莱奥波德·赫兹(LéoLéopoldHertz)2014年

@Masi不知道您是否仍然对此问题感兴趣。显然您正在使用system.modules而不是sys.modules
yegle 2014年

大声笑。我的错误是我最初没有导入sys -package。因此,改为运行import sys; sys.modules正常工作。
雷奥波德·赫兹(LéoLéopoldHertz)2014年

6

对于最新版本,例如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中最快,最简单的组合


4

pip Frozen完成了所有查找程序包的工作,但是只需编写以下命令即可列出python程序包所在的所有路径。

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

4

有很多方法可以给猫皮。

  • 最简单的方法是pydoc直接在shell中使用以下功能:
    pydoc modules

  • 但是,有关更多信息,请使用名为pip-date的工具,该工具还会告诉您安装日期。
    pip install pip-date


在此处输入图片说明


3

有很多想法,最初我会考虑以下两个方面:

点子

缺点:并非总是安装

帮助('模块')

缺点:输出到控制台;带有损坏的模块(请参见ubuntu ...)会导致segfault

我需要一个简单的方法,使用基本库并与旧python 2.x兼容

我看到了光:listmodules.py

2.5的文档源目录中隐藏着一个小脚本,该脚本列出了Python安装的所有可用模块。

优点:

仅使用imp,sys,os,re,time

设计用于在Python 1.5.2和更高版本上运行

源代码确实非常紧凑,因此您可以轻松修改它,例如,传递错误模块的异常列表(不要尝试导入它们)


3

我需要找到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

1

安装

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

1

这是一个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)


-10

从外壳

ls site-packages

如果那没有帮助,则可以执行此操作。

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

看看会产生什么。


哪个site-packages目录?这样可能会更好:ls / usr / {local /,} lib / python $(python -V 2>&1 | cut -d“” -f2 | cut -d。-f1-2)/ site-packages
vezult

这也将不显示内置模块或模块自定义PYTHONPATH,或者安装在setuptools的“发展模式”等的人
DF。

我的/usr/local/lib/python2.5/site-packages是空的,尽管我已经安装了模块。
莱奥列奥波尔德·赫兹준 영

14
不删除这个不满意的答案的荣誉。能够弄清为什么一个常见的答案被认为是错误的,这对社区很有帮助。
杰里米·斯坦

1
@JeremyStein更好的策略(更有用,并且对rep的破坏更少)可能是编辑问题以解释其原因,一旦在评论中对此进行了解释……
Kyle Strand
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.