如何查找从包中导入的 Python 模块?


包含 Python 代码、语句定义、函数或类的文件称为模块。我们将构建的名为“module”的模块是一个名为 module.py 的文件。

为了将复杂的程序分解成更小、更容易理解的部分,我们使用模块。代码重用是模块的另一个好处。

在本文中,我们将讨论查找从包中导入哪些 Python 模块的各种方法。

使用列表推导式

要遍历 Python 列表中的每个元素,列表推导式由包含表达式的括号组成,然后对每个元素运行该表达式。

Python 列表推导式提供了一种更短的语法,用于从现有列表的元素创建新列表。

示例

以下示例使用 sys 库和列表推导式,默认情况下以未排序列表的形式返回所有导入的本地模块名称。

使用 __name__(也称为 dunder),此代码迭代 sys.modules.values() 以检查项目是否为本地作用域模块。如果是,则使用模块名称保存“output”。为了提高可读性,此代码排列“output”变量并将其保存回自身。这些“output”的列表格式输出发送到终端。

import sys output = [module.__name__ for module in sys.modules.values() if module] output = sorted(output) print('The list of imported Python modules are :',output)

输出

以下是上述代码的输出 -

The list of imported Python modules are : ['__main__', '_bootlocale', '_codecs', '_collections', '_functools', 
'_heapq', '_imp', '_locale', '_operator', '_signal', 
'_sitebuiltins', '_stat', 
'_sysconfigdata_m_linux_x86_64-linux-gnu', '_thread', 
'_warnings', '_weakref', '_weakrefset', 'abc', 
'builtins', 'codecs', 'collections', 'collections.abc', 'collections.abc', 'contextlib', 'encodings', 
'encodings.aliases', 'encodings.latin_1', 
'encodings.utf_8', 'errno', 'functools', 'genericpath', 
'heapq', 'importlib', 'importlib._bootstrap', 
'importlib._bootstrap', 'importlib._bootstrap_external', 
'importlib._bootstrap_external', 'importlib.abc', 
'importlib.machinery', 'importlib.util', 'io', 'io', 
'itertools', 'keyword', 'marshal', 'mpl_toolkits', 
'operator', 'os', 'posix', 'posixpath', 'posixpath', 
'reprlib', 'site', 'stat', 'sys', 'sysconfig', 'types', 
'warnings', 'weakref', 'zipimport']

使用 pip freeze 命令

此函数显示所有导入的全局模块的名称和版本的列表,默认情况下按字母顺序排列。

示例

通过在 IDE 中打开终端窗口输入以下命令。为了执行,请按 Enter 键 -

C:\Users\Lenovo>pip freeze

输出

终端接收输出 -

aspose-cells==22.7.0
click==8.1.3
cloudpickle==2.1.0
colorama==0.4.5
dask==2022.7.0
et-xmlfile==1.1.0
fsspec==2022.5.0
genno==1.11.0
ixmp==3.5.0
JPype1==1.4.0
llvmlite==0.38.1
locket==1.0.0
message-ix==3.5.0
modcall==0.1.0
mysql-connector-python==8.0.29
namespace==0.1.4
native==0.0.0.0a0.dev20210615
numba==0.55.2
numpy==1.22.4
openpyxl==3.0.10
packaging==21.3
pandas==1.4.3
partd==1.2.0
Pint==0.19.2
protobuf==4.21.2
psycopg2==2.9.3
pycparser==2.21
pyparsing==3.0.9
python-dateutil==2.8.2
python-dotenv==0.20.0
python-magic==0.4.27
pytz==2022.1
PyYAML==6.0
scipy==1.9.1
six==1.16.0
sparse==0.13.0
toolz==0.12.0
walk==0.3.5
workbook==1.1
xarray==2022.3.0
xlrd==2.0.1
xlutils==2.0.0
xlwt==1.3.0

使用 dir() 方法

dir() 函数返回给定对象的所有属性和方法,但不返回其相关值。此函数甚至会返回所有对象默认的内置属性。

示例

以下示例中使用 dir() 方法返回所有本地模块名称的排序列表 -

module = dir() print('The list of imported Python modules are :',module)

输出

以下所示的输出表明此脚本仅显示与我们的本地范围相关的名称 -

The list of imported Python modules are : ['__annotations__', '__builtins__', '__cached__', 
'__doc__', '__file__', '__loader__', '__name__', 
'__package__', '__spec__']

使用 inspect.getmember() 和 Lambda

inspect 模块提供了一些有用的函数,可以帮助收集有关活动对象(如模块、类、方法、函数、回溯、帧对象和代码对象)的数据。它可以帮助您检查类的内容、检索方法的源代码、提取和格式化函数的参数列表,或收集显示详细回溯所需的所有数据,等等。

匿名、简短的函数称为 lambda。虽然 lambda 函数只能有一个表达式,但它可以有任意数量的参数。

示例

以下示例使用 inspect.getmember() 和 Lambda 以排序格式返回导入的本地模块。

此代码将导入的本地模块的名称及其在系统上的位置作为可迭代对象返回。这将通过 for 循环进行迭代并打印为一行。

import inspect import os modules = inspect.getmembers(os) results = filter(lambda m: inspect.ismodule(m[1]), modules) for o in results: print('The list of imported Python modules are :',o)

输出

以下是上述代码的输出 -

The list of imported Python modules are : ('abc', <module 'abc' from '/usr/lib64/python3.6/abc.py'>)
The list of imported Python modules are : ('errno', <module 'errno' (built-in)>)
The list of imported Python modules are : ('path', <module 'posixpath' from '/usr/lib64/python3.6/posixpath.py'>)
The list of imported Python modules are : ('st', <module 'stat' from '/usr/lib64/python3.6/stat.py'>)
The list of imported Python modules are : ('sys', <module 'sys' (built-in)>)

使用 sys 模块

sys.modules dict 可用于发现应用程序正在使用的特定包中的所有 Python 模块。sys.modules 是一个将模块名称链接到模块的字典。要查看导入的模块,您可以查看其键。

示例

以下是如何使用 sys 模块查找从包中导入的模块的示例

from datetime import datetime import sys print (sys.modules.keys())

输出

以下是上述代码的输出 -

dict_keys(['builtins', 'sys', '_frozen_importlib', 
'_imp', '_warnings', '_thread', '_weakref', 
'_frozen_importlib_external', '_io', 'marshal', 'posix', 
'zipimport', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', 
'__main__', 'encodings.latin_1', 'io', 'abc', '_weakrefset', '_bootlocale', '_locale', 'site', 'os', 
'errno', 'stat', '_stat', 'posixpath', 'genericpath', 
'os.path', '_collections_abc', '_sitebuiltins', 
'sysconfig', '_sysconfigdata_m_linux_x86_64-linux-gnu', 'types', 'functools', '_functools', 'collections', 
'operator', '_operator', 'keyword', 'heapq', '_heapq', 'itertools', 'reprlib', '_collections', 'weakref', 
'collections.abc', 'importlib', 'importlib._bootstrap', 'importlib._bootstrap_external', 'warnings', 
'importlib.util', 'importlib.abc', 'importlib.machinery', 'contextlib', 'mpl_toolkits', 'datetime', 'time', 'math', 
'_datetime'])

更新于: 2022 年 11 月 23 日

11K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告