【问题标题】:How do I import a Python script from a sibling directory?如何从同级目录导入 Python 脚本?
【发布时间】:2012-05-03 14:41:31
【问题描述】:

假设我有以下目录结构:

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

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

【问题讨论】:

标签: python import path pythonpath


【解决方案1】:

如果所有出现的目录都是 Python ,即它们都包含__init__.py,那么你可以使用

from ..bar_dir import bar

如果目录不是 Python 包,您可以通过使用 sys.path 来做到这一点,但您不应该这样做。

【讨论】:

  • 如果你想导入一个非包并且你只是从一个兄弟运行一个python,这将不起作用。在这种情况下 sys.path.append 是要走的路
  • @mhstnsc 我会说在这种情况下你做错了什么,但如果它只是一些 hacky 脚本,那么与sys.path 混在一起可能是可以的。
  • 没有错,但是在运行主模块时,您不能进行相对导入。 python.org/dev/peps/pep-0366
  • 当我对此运行ipython foo.py 时,我得到ImportError: attempted relative import with no known parent package。我已将__init__.py 文件添加到父目录和bar_dir 目录
  • @ogogmad,你找到解决方案了吗?谢谢
【解决方案2】:

您可以使用sysos 模块进行通用导入。在foo.py 中以行开头

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

【讨论】:

  • 请注意,这将使用 cwd 的同级目录,而不是 foo.py 所在的同级目录。要使用脚本的目录,请使用sys.path.append(os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'bar')))
  • 唯一在整个页面上起作用的东西。
【解决方案3】:

如果您在 python 3+ 中遇到问题,使用sys.path.append("..") 对我有用。

sys.path.append("..")
from bar_dir import bar

【讨论】:

    【解决方案4】:

    假设你有以下结构:

    root
      |_ productconst.py
      |_ products
         |_ __init__.py
    

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

    from ..productconst import * 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 2020-03-28
      相关资源
      最近更新 更多