【问题标题】:how many pip packages do one have installed on google colab?在 google colab 上安装了多少个 pip 包?
【发布时间】:2022-10-23 17:40:20
【问题描述】:

我可以通过!pip list 查看所有软件包的列表。

我可以这样做来计算python 3.7 文件夹中的所有子文件夹:

import os
containing_folder = '/usr/local/lib/python3.7/dist-packages'


f = []
for (dirpath, dirnames, filenames) in os.walk(containing_folder):
    f.extend(dirnames)
    break

print('there are', len(f), 'folders in the python 3.7 module')

但是文件夹的数量并不等于模块的数量,因为文件似乎比模块多。

那么如何识别所有模块(而不是文件夹)? (即计算所有 pip 安装的文件夹)。

【问题讨论】:

  • 为什么不能只使用运行pip list 的结果?为什么你关心安装了多少模块?
  • 嗨@CryptoFool。因为我需要手动计算列表中的每一个。这本质上是我的问题...!pip list 是否返回一个列表或者我可以将 pip 列表作为列表?
  • !pip list | nl 添加数字。
  • @tripleee,这行得通,所以如果想以编程方式获取该列表的最后一个值,可以这样做吗?
  • @D.L - 是的,如果您使用 subprocess 模块运行 pip,应该可以正常工作。我正在尝试的是同样的事情......@ 987654329@。如果您确实使用subprocess 来执行此操作,请确保将shell=True 添加为参数。你需要让你的命令通过 shell 运行,这样管道才能工作。

标签: python pip google-colaboratory


【解决方案1】:

Python 包由名为__init__.py 的文件的存在表示。因此,如果您想根据该正式定义来计算包的数量,您可以只计算使用该名称找到的文件的数量。这是执行此操作的代码:

import os
containing_folder = '/usr/local/lib/python3.7/dist-packages'

f = []
for (dirpath, dirnames, filenames) in os.walk(containing_folder):
    if '__init__.py' in filenames:
        f.append(os.path.basename(dirpath))

print(f)

print('there are', len(f), 'folders in the python 3.7 module')

如果您只想计算目录第一级的包数,这可能是您想要的,这里的代码可以做到这一点:

import os
containing_folder = '/usr/local/lib/python3.7/dist-packages'

r = []
for entity in os.listdir(containing_folder):
    f = os.path.join(containing_folder, entity, '__init__.py')
    if os.path.isdir(os.path.join(containing_folder, entity)) and os.path.join(entity) and os.path.exists(f):
        r.append(entity)

print(len(r))

当我在我的一个 Python 安装上运行此代码,并将其与我在同一版本的 Python 上执行pip list | wc -l 时得到的结果进行比较时,我得到了几乎相同的结果...125 用于 Python 代码,@ 987654326@ 为pip

【讨论】:

  • 我认为答案将是这样的,但是当我运行上述文件时似乎有5729 文件......这似乎是很多人的方式。
  • 我很确定代码正在做我所说的事情。我在同一个目标目录上运行find . -name "__init__.py" | wc -l,得到的结果与 Python 给我的结果完全相同。我也得到了一个看起来相当高的数字。但我想不出 Python 代码和 find 命令可能以完全相同的方式出错。现在,如果您选择定义不同的“包”,那么您需要根据该定义的另一种机制。这就是为什么我说“根据该正式定义计算包”。
  • 我听到你在说什么。我的“包的定义”!pip list 的结果,假设它是一个有效的定义......
  • 我只是将生成的列表写入文件并查看了它。对我来说似乎是对的。较大的包有大量的子包。例如,Pandas 有 147 个子包。如果您只想要主要模块,您可以在目录深度的一个级别或类似的位置查找__init__.py 文件,或者可能在您第一次找到__init__.py 文件时停止。
【解决方案2】:

你可以use pip programmatically(坦率地说,找到这方面的文档有点令人生畏)。 理论上,您可以 import pip 并使用其内部 API 来获取您想要的信息,但文档不鼓励这样做,而是建议您像任何非本地外部实用程序一样使用 pip

import subprocess

packages = subprocess.run(
    ['pip', 'list'].
    check=True, text=True, capture_output=True)
packagelist = packages.stdout.splitlines()

有很多关于subprocess 的细节可以从更详细的解释中受益,但它已经完成many times before. 也许对于这个讨论,主要注意在类 Unix 系统上需要将第一个参数作为令牌列表传递: you want avoid shell=True (which you want, when you can)

【讨论】:

    猜你喜欢
    • 2019-01-29
    • 2021-05-29
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 2020-06-01
    • 1970-01-01
    相关资源
    最近更新 更多