如何从同级目录导入 Python 脚本?

100

假设我有以下目录结构:

parent_dir/
    foo_dir/
        foo.py
    bar_dir/
        bar.py

如果我想在foo.py中导入bar.py,我该怎么做?


请参见:https://dev59.com/Im015IYBdhLWcg3w6QA0#27878845 - Paolo Rovelli
4个回答

56

如果所有出现的目录都是Python ,也就是它们都包含__init__.py文件,那么你可以使用以下方法:

from ..bar_dir import bar

如果这些目录不是Python包,你可以通过操作sys.path来实现,但你不应该这样做。


5
如果您想从兄弟目录中运行Python并且希望导入到非包中,则此方法不起作用。在这种情况下,应该使用sys.path.append。 - mhstnsc
1
@mhstnsc 我会说在这种情况下你做错了什么,但如果只是一些hacky脚本,那么玩弄sys.path可能是可以的。 - Sven Marnach
3
虽然这句话本身没有错,但是在运行主模块时你不能使用相对导入。更多信息请参考此链接:https://www.python.org/dev/peps/pep-0366/ - mhstnsc
51
当我在这个环境下运行 ipython foo.py 的时候,会得到以下错误信息:ImportError: attempted relative import with no known parent package。我已经在父目录和 bar_dir 目录中添加了一个 __init__.py 文件。 - wlad
3
这在 Python 3.8 中是有效的,但要求父包对 Python 可访问,并且该模块作为该包的一部分被导入。我可能应该稍微扩展一下这个答案,但现在没时间这样做。 - Sven Marnach
显示剩余2条评论

46

您可以使用 sysos 模块进行通用导入。在 foo.py 中,从以下行开始:

import sys
import os
sys.path.append(os.path.abspath('../bar_dir'))
import bar

11
请注意,这将使用当前工作目录的兄弟目录,而不是 foo.py 所在的兄弟目录。要使用脚本的目录,请使用 sys.path.append(os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'bar'))). - cowlinator
1
这整个页面中唯一有效的东西。 - C.J.

4
假设你有以下结构:
root
  |_ productconst.py
  |_ products
     |_ __init__.py

如果您想在products.__init__中导入productconst,则可以使用以下代码:

from ..productconst import * 

0
如果您在Python 3+中遇到问题,以下方法对我有效:sys.path.append("..")
sys.path.append("..")
from bar_dir import bar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接