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

2024-04-28 21:11: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分支引用工作,如果我独立运行,直接模块名导入工作。但这并不完美,我希望为仍然在独立模块测试中工作的包间调用提供一个导入语句。可能吗


Tags: 模块代码namefromimportifmain分支
1条回答
网友
1楼 · 发布于 2024-04-28 21:11:14

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()

相关问题 更多 >