独立运行python包子模块以进行自检;导入路径冲突

时间:2019-11-09 23:28:14

标签: python

我经常在模块底部编写自检代码,即

if __name__ == '__main__':

.
.
.

我希望将此内容保留在模块中,以便在我对其进行修改时仍可以对其进行自检。该模块是包装的一部分。因此,有一些包间引用需要解决。但是如果我导入软件包而不是独立运行模块,则这些问题的解决方式会有所不同。

我最终在模块顶部遇到这样的错误,这肯定很丑陋,而且可能不是'pythonic':

if __name__ == '__main__':

    from CovSample import CovSample
    from ArrayByRow import ArrayByRow    
else:

    from CEOpt import CovSample
    from CEOpt import ArrayByRow

这有效-如果我要导入程序包CEOpt-else-branch引用有效,并且如果我独立运行-直接模块名称导入有效。但是,我想要一个import语句来表示仍然可以在独立模块测试中使用的包间调用。有可能吗?

1 个答案:

答案 0 :(得分:0)

It seems,在__name__=='__main__'__name__!='__main__'两种情况下都没有通用的方法。

我要做的是:在每个子模块内定义一个Test()函数(因此CEOpt.CovSample.Test()CEOpt.ArrayByRow.Test())。然后创建一个CEOpt/__main__.py文件,这是CEOpt包中唯一可以直接“运行”的文件(该特定文件名可确保当您说{{ 1}}。该文件必须按名称明确python -m CEOpt,但至少现在只必须在一个地方发生(其他文件可以使用带有前缀点语法的相对导入,例如import CEOpt)。现在,对from .CovArray import CovArray的逻辑进行编程,以使其响应通过__main__.py传递的子命令,选择要运行哪个子模块的sys.argv函数。

例如,语法Test()(或从IPython提示符等效为python -m CEOpt test CovArray)将触发%run CEOpt/__main__ test CovArray调用__main__.py