下面的错误看起来是不似乎非常熟悉,这个经常出现在我们的代码报错中:
python3: No module named [模块名称]
这可能是因为你没有安装正确的依赖项,当 定义的依赖项集与正在运行的应用程序代码不匹配时,通常会发生这种情况。
相反,有时可能安装了太多软件包,从而使你的软件包大小变大,减慢了部署速度,并花费了您更多的时间和金钱,这通常在拆分服务、删除死代码或迁移到新软件包时发生。
在这两种情况下,我们都需要检查我们的代码并确保已安装的依赖项集 == 已使用的依赖项,在最好的情况下,我们还可以强制这种状态永久存在。
假设已定义已安装的依赖项,我们如何找出我们使用的依赖项?有一个内置命令可以显示给定 Python 模块的外部依赖项,让我们对存储库本身进行 dogfood 测试,以确保我们的依赖项集正确!
首先 - 安装 tach:
\> pip install tach
接下来,让我们进行设置,以便它可以理解我们的项目,我们可以通过以下方式将我们的 Python 源根指示为:
\> tach mod
这种情况下,我们的源根位于存储库的根目录中,这会将项目的配置写入 。
接下来,让我们运行内置命令来显示 Rich 中的依赖项,所有 Python 代码都在 :
> tach report-external --raw python/tachpydanticpyyamlgitpythonrichprompt-toolkittomli-wnetworkxstdlib-listimportlib-metadata
请注意,我们过去只以 PEP 508 格式打印每个依赖项一次,如果未设置此标志,将输出第三方依赖项的每次使用。
在这里,我们可以看到 tach 使用了 9 个外部依赖项 - 我们可以通过检查以下内容来验证这一事实:pyproject.toml
dependencies = [ "pyyaml~=6.0", # pyyaml "tomli-w~=1.0", # tomli-w "pydantic~=2.0", # pydantic "rich~=13.0", # rich "prompt-toolkit~=3.0", # prompt-toolkit "GitPython~=3.1", # gitpython "networkx~=3.0; python_version > '3.7'", # networkx "networkx>=2.6,<4.0; python_version == '3.7'", "pydot~=2.0", # ??? "stdlib-list>=0.10.0; python_version < '3.10'", # stdlib-list "importlib_metadata>=6.5; python_version == '3.7'", # importlib-metadata]
有趣的是 - 在这里,我们看到大多数依赖项都被覆盖了,但没有告知!这是怎么回事?
如果我们检查代码,我们会看到:
# tach/show.pyif TYPE_CHECKING: ... import pydot
因为 位于 类型检查块中,所以它不是会阻止执行的依赖项, 默认情况下,忽略这些类型的导入,如果我们想要显示它,我们可以在配置中翻转标志:pydot``tach``ignore_type_checking``tach.toml
# tach.toml...ignore_type_checking_imports = false
现在,如果我们运行 ,我们会看到 !tach report-external --raw python/tach``pydot
> tach tach report-external --raw python/tachgitpythonnetworkxpydanticpyyamlprompt-toolkitstdlib-listrichpydottomli-wimportlib-metadata
太棒了 - 我们使用的依赖项与我们声明的依赖项相匹配!
通常,当有人删除必需的依赖项时,现有工具链中的某个地方将出现故障,但是,通常很难识别依赖项周围的其他膨胀 - 这就是需要 tach check-external 的地方
check-external 验证您定义的代码是否仅导入并使用您列出的第三方依赖项。这甚至适用于多个源根!我们可以在 CI 中使用此命令来验证我们是否与第三方依赖项完全匹配:
> tach check-external✅ All external dependencies validated!
这确保我们永远不会缺少我们需要的安装依赖!
原文:https://www.gauge.sh/blog/find-your-third-party-dependencies-in-python

长按或扫描下方二维码,免费获取 Python公开课和大佬打包整理的几百G的学习资料,内容包含但不限于Python电子书、教程、项目接单、源码等等
▲扫描二维码-免费领取
推荐阅读
再用 `print` 进行 Python调试,你就OUT啦!
点击 阅读原文了解更多