如何从兄弟目录导入Python脚本?

Orc*_*ris 40 python import path pythonpath

这是目录结构:

parent_dir/
    foo_dir/
        foo.py
    bar_dir/
        bar.py
Run Code Online (Sandbox Code Playgroud)

如何将bar.py导入foo.py?

Sve*_*ach 37

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

from ..bar_dir import bar
Run Code Online (Sandbox Code Playgroud)

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

  • 当我在上面运行`ipython foo.py`时,我得到`ImportError:尝试相对导入,没有已知的父包。我在父目录和bar_dir目录中添加了一个__init__.py文件。 (8认同)
  • 如果您想在非包中导入并且您只是从同级运行 python,这将不起作用。在这种情况下 sys.path.append 是要走的路 (4认同)
  • 它没有错,但是在运行主模块时,您不能进行相对导入。https://www.python.org/dev/peps/pep-0366/ (3认同)
  • 这在 Python 3.8 中确实有效,但要求 Python 可以访问父包,并且该模块作为该包的一部分导入。我可能应该稍微扩展一下这个答案,但没有时间这样做。 (3认同)

prr*_*rao 20

您可以将sysos模块用于通用导入.在foo.py开始与线

import sys
import os
sys.path.append(os.path.abspath('../bar_dir'))
import bar
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这将使用 cwd 的同级目录,而不是 `foo.py` 所在的同级目录。要使用脚本的目录,请使用 `sys.path.append(os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__))), '..', 'bar' )))` (2认同)