【发布时间】:2012-01-08 02:44:45
【问题描述】:
我知道有很多关于 Python 中相同导入问题的问题,但似乎没有人设法提供正确用法的明确示例。
假设我们有一个包mypackage,其中包含两个模块foo 和bar。在foo 内部,我们需要能够访问bar。
因为我们还在开发中,mypackage 不在sys.path 中。
我们希望能够:
- 导入
mypackage.foo - 将
foo.py作为脚本运行并从__main__部分执行示例用法或测试。 - 使用 Python 2.5
我们必须如何在 foo.py 中进行导入,以确保它在所有这些情况下都能正常工作。
# mypackage/__init__.py
...
# mypackage/foo/__init__.py
...
# mypackage/bar.py
def doBar()
print("doBar")
# mypackage/foo/foo.py
import bar # fails with module not found
import .bar #fails due to ValueError: Attempted relative import in non-package
def doFoo():
print(doBar())
if __name__ == '__main__':
doFoo()
【问题讨论】:
-
我相信你必须区分可导入模块和脚本。我不确定我是否同意这种设计,但这是我对它的理解。
-
通常,当您需要从上层导入包时,您做错了:您是否希望将
bar用作库而不是 mypackage 的子模块? IE。您能否将 mypackage 重构为 mypackage1 和 mypackage2 ,其中 mypackage2(带有 foo)导入 mypackage1(带有 bar)?
标签: python import relative-path python-2.5