Python:从父文件夹导入文件

14 投票
3 回答
37175 浏览
提问于 2025-04-16 09:38

...我知道这个问题已经被问过很多次了,我也看过其他的讨论。不过到现在为止,尝试过的方法都没有成功,从使用 sys.path.append('.') 到直接导入 foo,都没用。

我有一个 Python 文件,想要导入一个在它的上级目录里的文件。你能帮我弄明白我的子文件怎么才能成功导入它的上级目录里的文件吗?我使用的是 Python 2.7。

文件结构是这样的(每个目录里都有 __init__.py 文件):

StockTracker/  
└─ Comp/  
   ├─ a.py  
   └─ SubComp/  
      └─ b.py

在 b.py 里,我想导入 a.py:所以我尝试了以下每一种方法,但在 b.py 里还是出现了错误,提示 "没有这样的模块 a"

import a

import .a

import Comp.a

import StockTracker.Comp.a

import os
import sys
sys.path.append('.')
import a    
sys.path.remove('.')

3 个回答

7

如果你的 Comp 目录在 PYTHONPATH 环境变量中,普通的

import a

就可以正常工作了。

如果你是在 Linux 或 OS X 系统上,并且是通过 bash 终端启动你的程序,你可以通过以下方式来实现:

export PYTHONPATH=$PYTHONPATH:/path/to/Comp

对于 Windows 用户,可以参考以下链接:

编辑:

如果你想通过代码来修改路径,你在最开始的问题中已经走在正确的方向上。你只需要添加上级目录,而不是当前目录。

sys.path.append("..")
import a
10

当一个包被分成多个子包时(就像示例中的sound包),你可以使用绝对导入来引用兄弟包中的子模块。比如,如果sound.filters.vocoder模块需要使用sound.effects包中的echo模块,它可以这样写:from sound.effects import echo。

从Python 2.5开始,除了上面提到的隐式相对导入,你还可以使用显式相对导入,这种导入方式是用from模块 import 名称的格式。显式相对导入使用前导点来表示当前包和父包,这样可以更清楚地指明涉及的包。例如,从surround模块中,你可能会这样使用:

from . import echo
from .. import formats
from ..filters import equalizer

引用来自这里 http://docs.python.org/tutorial/modules.html#intra-package-references

15
from .. import a

这样做应该没问题。这个方法只适用于较新的Python版本——我记得是从2.6开始的[编辑:其实是从2.5就可以了]。

每个层级(包括Comp和Subcomp)都必须有一个__init__.py文件,这样才能正常工作。你说它们都有这个文件。

撰写回答