Python包结构

发布于 2021-01-29 18:14:27

我有一个带有几个子包的Python包。

myproject/
  __init__.py
  models/
    __init__.py
    ...
  controllers/
    __init__.py
    ..
  scripts/
    __init__.py
    myscript.py

在myproject.scripts.myscript中,如何访问myproject.models?我试过了

from myproject import models # No module named myproject
import models # No module named models
from .. import models # Attempted relative import in non-package

我以前必须解决此问题,但我永远不记得应该怎么做。这对我来说并不直观。

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是正确的版本:

    from myproject import models
    

    如果失败,ImportError: No module named foo则是因为尚未设置PYTHONPATH包含的目录myproject/

    恐怕其他人会建议一些技巧,让您避免设置PYTHONPATH。我敦促您不要理them它们。这就是PYTHONPATH存在的原因:告诉Python在哪里寻找要加载的代码。它功能强大,文档合理,可移植到许多环境中。人们为了避免设置技巧而玩技巧并不是这些。

    显式相对进口
    工作,即使没有PYTHONPATH被设置,因为它可能只是走了目录层次结构,直到找到合适的位置,它并不需要找到顶部,然后往下走。但是,它在您作为命令行参数传递给python(或等效地,直接用#!/usr/bin/python一行调用)的脚本中不起作用。这是因为在这两种情况下,它都成为__main__流程的模块。无处可走__main__-它已经在顶部了!如果您通过
    导入 该模块在脚本中调用代码,那么就可以了。也就是说,比较:

    python myproject/scripts/myscript.py
    

    python -c 'import myproject.scripts.myscript'
    

    您可以通过不直接执行脚本模块,而是创建一个bin/myscript执行导入并可能调用主函数的方法来利用此功能:

    import myprojects.scripts.myscript
    myprojects.scripts.myscript.main()
    

    比较一下Twisted的命令行脚本的定义方式:http
    :
    //twistedmatrix.com/trac/browser/trunk/bin/twistd



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看