繁体   English   中英

Python包结构

[英]Python package structure

我有一个包含几个子包的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

我以前必须解决这个问题,但我永远不会记得它应该如何完成。 这对我来说并不直观。

这是正确的版本:

from myproject import models

如果它因ImportError: No module named foo失败ImportError: No module named foo那是因为你没有设置PYTHONPATH来包含包含myproject/的目录。

我担心别人会建议让你避免设置PYTHONPATH 我劝你不要理会他们。 这就是PYTHONPATH存在的原因:告诉Python在哪里寻找要加载的代码。 它功能强大,文档记录合理,可移植到许多环境中。 人们玩耍以避免不得不设置它们都不是这些。

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

python myproject/scripts/myscript.py

python -c 'import myproject.scripts.myscript'

您可以通过不直接执行脚本模块来利用此功能,但创建执行导入的bin/myscript并可能调用main函数:

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

与Twisted的命令行脚本的定义相比: http//twistedmatrix.com/trac/browser/trunk/bin/twistd

您的项目不在您的路径中。

选项A.

  • 安装你的软件包,以便python可以从任何地方通过其绝对名称找到它(使用from myproject import models

选项B.

  • Trickery将相对父级添加到路径中
  • sys.path.append(os.path.abspath('..'))

建议使用前一种选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM