Py学习  »  Python

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

Keith Brodie • 4 年前 • 493 次点击  

我经常在模块的底部编写自测代码。

if __name__ == '__main__':

.
.
.

我想把它保存在模块中,这样如果我修改它,我仍然可以对它运行自检。模块是包的一部分。因此,有一些包间引用需要解析;但是如果我导入包而不是独立运行模块,这些引用的解析方式会有所不同。

最后,我在模块的顶部出现了一个像这样的乱七八糟的东西,这肯定很难看,而且可能不是“蟒蛇式的”:

if __name__ == '__main__':

    from CovSample import CovSample
    from ArrayByRow import ArrayByRow    
else:

    from CEOpt import CovSample
    from CEOpt import ArrayByRow

如果导入包CEOpt,else分支引用工作,如果独立运行,直接模块名导入工作。但我不想为仍然在独立模块测试中工作的包间调用使用一个import语句。有可能吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49324
 
493 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Jez
Reply   •   1 楼
Jez    4 年前

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

我要做的是:定义 Test() 每个子模块内的函数(因此 CEOpt.CovSample.Test() CEOpt.ArrayByRow.Test() ). 然后创建一个 CEOpt/__main__.py 文件,这是 CEOpt 您将直接“运行”的包(该特定文件名确保在您说 python -m CEOpt 从你的壳里)。此文件必须 import CEOpt 按名称显式地,但至少现在只能在一个地方发生(例如,其他文件可以使用带前缀的点syntax的相对导入 from .CovArray import CovArray ). 现在编程的逻辑 __main__.py 从而响应通过 sys.argv ,选择哪个子模块的 测试() 要运行的函数。

例如,语法 python -m CEOpt test CovArray (或同等地 %run CEOpt/__main__ test CovArray 从IPython提示符)将触发 __主要的 打电话 CEOpt.CovArray.Test()