从父目录导入脚本

问题描述 投票:0回答:4

如何导入位于父目录中的模块(python 文件)?

两个目录中都有一个

__init__.py
文件,但我仍然无法从父目录导入文件?

在此文件夹布局中,脚本 B 正在尝试导入脚本 A:

Folder A:
   __init__.py
   Script A:
   Folder B:
     __init__.py
     Script B(attempting to import Script A)

脚本 B 中的以下代码不起作用:

import ../scriptA.py # I get a compile error saying the "." is invalid
python import
4个回答
83
投票

您不会在导入模块的 Python 中导入脚本。一些 python 模块也是可以直接运行的脚本(它们在模块级别做一些有用的工作)。

一般来说,最好使用绝对导入而不是相对导入。

toplevel_package/
├── __init__.py
├── moduleA.py
└── subpackage
    ├── __init__.py
    └── moduleB.py

moduleB

from toplevel_package import moduleA

如果您想将

moduleB.py
作为脚本运行,请确保
toplevel_package
的父目录在您的
sys.path
.


37
投票

来自docs

from .. import scriptA

您可以在包中执行此操作,但不能在直接运行的脚本中执行。从上面的链接:

请注意,显式和隐式相对导入均基于 当前模块的名称。由于主模块的名称是 始终为“__main__”,旨在用作主模块的模块 Python 应用程序应始终使用绝对导入。

如果您创建一个导入 A.B.B 的脚本,您将不会收到 ValueError。


6
投票

如果想直接运行脚本,可以:

  1. 将FolderA的路径加入环境变量(
    PYTHONPATH
    ).
  2. 在脚本中添加
    sys.path
    的路径。

然后:

import module_you_wanted

0
投票

我遇到了同样的问题,并在 PyPI 上发布了 syspend 模块 https://pypi.org/project/syspend/ 这将搜索具有特定命名文件的父目录,并调用 sys.path.append(目录:具有 SYSPEND_ROOT 文件)。

Folder A:
   __init__.py
   Script A:
   Folder B:
     __init__.py
     Script B(attempting to import Script A)
   SYSPEND_ROOT

在您的情况下,请放入 SYSPEND_ROOT 文件。空文件是可以的。 在你的 ScriptB.py

import syspend
import ScriptA

if __name__ == "__main__":
    ScriptA.method()
© www.soinside.com 2019 - 2024. All rights reserved.