我经常在模块的底部编写自检代码,即
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分支引用工作,如果我独立运行,直接模块名导入工作。但这并不完美,我希望为仍然在独立模块测试中工作的包间调用提供一个导入语句。可能吗
It seems在这两种情况下,
__name__=='__main__'
和__name__!='__main__'
都没有通用的方法我要做的是:在每个子模块内定义一个
Test()
函数(所以CEOpt.CovSample.Test()
和CEOpt.ArrayByRow.Test()
)。然后创建一个CEOpt/__main__.py
文件,这是CEOpt
包中唯一一个您将直接“运行”的文件(该特定文件名确保当您在shell中说python -m CEOpt
时,它就是运行的文件)。该文件必须按名称显式地import CEOpt
,但至少现在必须只在一个地方发生(其他文件可以使用带有前缀点语法的相对导入,例如from .CovArray import CovArray
)。现在对__main__.py
的逻辑进行编程,以便它响应通过sys.argv
传入的子命令,选择要运行的子模块的Test()
函数例如,语法
python -m CEOpt test CovArray
(或者相当于来自IPython提示符的%run CEOpt/__main__ test CovArray
)将触发__main__.py
调用CEOpt.CovArray.Test()
相关问题 更多 >
编程相关推荐