首页 > 解决方案 > 独立运行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 引用有效,如果我正在独立运行 - 直接模块名称导入有效。但这并不漂亮我想要一个仍然在独立模块测试中工作的包间调用的导入语句。那可能吗?

标签: python

解决方案


似乎没有适用于这两种情况的通用方法,__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()


推荐阅读