python - 独立运行python包子模块进行自检;导入路径组合
问题描述
我经常在一个模块的底部写自检代码,即
if __name__ == '__main__':
.
.
.
我想把它保存在模块中,这样如果我修改它,我仍然可以在它上面运行自检。该模块是包的一部分。所以有包间引用需要解决;但是如果我导入包而不是独立运行模块,这些解决方法会有所不同。
我最终在我的模块顶部有一个这样的kludge,这肯定是丑陋的,可能不是'pythonic':
if __name__ == '__main__':
from CovSample import CovSample
from ArrayByRow import ArrayByRow
else:
from CEOpt import CovSample
from CEOpt import ArrayByRow
这有效 - 如果我正在导入包 CEOpt - else-branch 引用有效,如果我正在独立运行 - 直接模块名称导入有效。但这并不漂亮我想要一个仍然在独立模块测试中工作的包间调用的导入语句。那可能吗?
解决方案
似乎没有适用于这两种情况的通用方法,__name__=='__main__'
并且__name__!='__main__'
.
我所做的如下:Test()
在每个子模块(soCEOpt.CovSample.Test()
和CEOpt.ArrayByRow.Test()
)中定义一个函数。然后创建一个CEOpt/__main__.py
文件,这是CEOpt
您将直接“运行”的包中唯一的文件(该特定文件名确保它是当您python -m CEOpt
从 shell 中运行时运行的文件)。该文件必须import CEOpt
明确地按名称命名,但至少现在只需要在一个地方发生(其他文件可以使用带有前缀点语法的相对导入,例如from .CovArray import CovArray
)。现在编写逻辑__main__.py
,使其响应通过传入的子命令sys.argv
,选择Test()
要运行的子模块的功能。
因此,例如,语法python -m CEOpt test CovArray
(或等效地%run CEOpt/__main__ test CovArray
来自 IPython 提示符)将触发__main__.py
调用CEOpt.CovArray.Test()
推荐阅读
- django - 如何在 Django 中显示今天、昨天和过去 7 天的数据?
- java - 使用一组压缩主题中的所有记录的最简单的 Spring Kafka @KafkaListener 配置是什么?
- postgresql - apache ignite 或任何其他用于 postgres 的内存缓存
- node.js - 将 ElephantSQL 与 node.js 连接
- python-3.x - 遵循 IG 抓取教程并停留在 XPath/其他问题上
- angular - 将 HTML 传递到 Mat 对话框
- android - 来自 instagram 克隆 android 应用程序的数据未反映在 Firebase 中的实时数据库中
- build - 从 Azure DevOps 构建可视化代码指标的选项有哪些?
- azure - 是否可以在日志分析中查询 Azure 数据仓库
- xcodebuild - iOS 14,为设备和模拟器创建库时出现 lipo 错误