我经常在模块底部编写自检代码,即
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语句来表示仍然可以在独立模块测试中使用的包间调用。有可能吗?
答案 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