从一级目录(包)导入模块

sta*_*kjs 8 python

Python从一级目录导入模块的正确方法是什么?该目录是一个包含所有这些模块的Python包,我有一个子目录,其中包含需要这些模块的代码.

以下工作正常,但这只是一个黑客.我想要推荐/ pythonic方式.

import sys
sys.path.append("../")
from fruit import Fruit
print("OK")
Run Code Online (Sandbox Code Playgroud)

目录结构:

pkg1
   __init__.py  
   fruit.py  
   +sub_pkg
      __init__.py
      recipe.py
Run Code Online (Sandbox Code Playgroud)

fruit.py的内容

class Fruit:
   def get_name(self):
       print("Fruit name")
Run Code Online (Sandbox Code Playgroud)

sub_pkg/recipe.py..的内容只是一个导入行:

from fruit import Fruit
Run Code Online (Sandbox Code Playgroud)

当我跑:

python recipe.py
Run Code Online (Sandbox Code Playgroud)

它给出了以下错误.

Traceback (most recent call last):
  File "recipe.py", line 2, in <module>
    from fruit import Fruit
ImportError: No module named fruit
Run Code Online (Sandbox Code Playgroud)

我也试过:from pkg1.fruit import Fruit,不行.还看了其他类似的问题.. python -m recipe.pypython -m sub_pkg/recipe.py没有奏效.

For*_*rge 9

在您的主文件中recipe.py添加pkg1路径PYTHONPATH

sys.path.append('/path/to/pkg1')
Run Code Online (Sandbox Code Playgroud)

或者使用相对路径

sys.path.append('../..')
Run Code Online (Sandbox Code Playgroud)

这应该允许pkg1从程序中的任何位置导入。

始终可以选择使用此处建议的相对导入,我发现使用绝对导入更具可读性并且不太可能导致错误。此外,在使用相对导入的大型项目中,您将不断计算路径层次结构,而在使用绝对导入时,很容易知道您总是引用一个根目录。

关于Python 2.5 中PEP328 的相对导入:

阅读依赖于相对导入的代码也不太清楚,因为读者可能对打算使用哪个模块感到困惑。Python 用户很快学会了不要在其包的子模块的名称中重复标准库模块的名称,但是您无法防止子模块的名称被用于在未来版本的 Python 中添加的新模块。


Guido建议在相对导入中使用前导点以避免如上所述的歧义导入,再次来自PEP328

Guido 已宣布相对导入将使用前导点。单个前导点表示从当前包开始的相对导入。两个或更多前导点对当前包的父级进行相对导入,每个点在第一个之后一个级别。