天天看点

关于Python Package下的Module import方式[转]

言归正传,今天要探讨的是一个有关python package下的module import的问题,这是我在进行一个python工程源码组织设计时遇到的。一般来说,我们的工程代码组织形式如下:

py-proj/

    main.py

    pkg1/

        __init__.py

        mod1.py

    pkg2/

        mod2.py

    test/

        testmod1.py

        testmod2.py

工程的dev需求如下:

* 执行main.py(其中import了各个pkg的module)

* 能够单独执行pkg下的某个module

* 兄弟pkg间可以相互import module

* 能够单独执行test下的某个module的test用例

* 能够一次执行test下的所有module的test用例

基于工程的这些dev需求,我们来看一下module import方式的选择。

* 执行main.py

无论当前工作目录(current working directory)是哪个目录,一旦执行main.py,python就会自动将main.py所在的目录添加到sys.path中去,作为一个 module search path的entry。这样只要工程下的文件都采用了absolute import,python就可以正确找到并import正确的module。

* 单独执行某pkg下的某个module

我们在dev时有这样的需求:单独执行某个正在编写的module的代码以获得一些执行结果的反馈。不过,以上面例子中的代码结构为例,如果我们进入到 pkg1目录下执行python mod1.py,一旦mod1.py引用了pkg2.mod2,你就会收到如下错误(前提是你使用了absolute import):

$ python mod1.py

traceback (most recent call last):

  file "mod1.py", line 2, in <module>

    import pkg2.mod2

importerror: no module named pkg2.mod2

因为python只是将pkg1这个路径加入到module search path中了,这个路径下显然没有pkg2/mod2.py。不过我们可以通过在工程top-level路径下执行"python -m pkg1.mod1"来单独执行mod1的代码,这样absolute import依然生效,不会导致import error。

这个与上面的执行方法类似,只要在top-level下通过python -m执行,那么无论pkg层次多深,无论有多少兄弟package,python总是可以找到正确的module并导入。

* 单独执行test下的某个module的test用例

这有些类似于引用兄弟package的情况。我们通过在顶层路径下执行python -m test.testmod1即可达到此目的。

* 一次执行test下的所有module的test用例

较新的python版本已经可以自动发现测试用例并执行。我们通过在top-level目录执行python -m unittest discover test即可执行test目录下所有符合unittest包约定要求的单元测试用例文件。在执行这个命令时,python会将top-level路径以及 test路径都加入到module search path中。

终上,absolute import可以满足所有需求。虽然有时候absolute import从代码上会看起来有些冗长(通过from … import …能有所缓解),但在语义理解的简单性和可读性上的优势让我更加倾向于这种方式。另外通常情况下我们是无需重新设置pythonpath,也用不 到.pth文件,更不需在代码里修改sys.path来改变python的module search path的。

from:http://tonybai.com/2013/01/24/the-module-import-way-under-python-package/

欢迎加群互相学习,共同进步。qq群:ios: 58099570 | android: 330987132 | go:217696290 | python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/p/4812110.html