【问题标题】:How to import module from parent directory without sys.path?如何在没有 sys.path 的情况下从父目录导入模块?
【发布时间】:2019-09-27 13:12:06
【问题描述】:

我正在尝试从父包中调用模块。

我的项目结构-

be/
  __init__.py
  api/
    __init__.py
    models.py
  alembic/
    env.py

如何在env.py内部调用models.py

我尝试如下,

from api.models import Base

我收到错误 - ImportError: No module named 'api'

我想通过将alembic目录放在api目录中进行重组,仍然无法导入models

使用sys.path 看起来很hacky,如果我应该更改项目结构,请提出建议。

【问题讨论】:

  • @vahdet - 在这个答案中,他们正在使用我想避免的sys.pathpython3.6 不支持的..
  • 你可以使用PYTHONPATH环境变量
  • 试试from be.api.models import Basefrom ..api.models import Base
  • .. 支持已被放弃 G_G,o 不知道

标签: python python-3.6


【解决方案1】:

你可以使用相对导入

env.py里面,你只需要from ..api.models import Base

如果不想使用相对导入,也可以试试绝对导入,比如

from be.api.models import Base

前提是你已经将PYTHONPATH导出到be by

path_to_be=''
export PYTHONPATH=$path_to_be:$PATH

【讨论】:

    【解决方案2】:

    一些建议:

    1.) 接受它并修改 sys.path ;-)

    2.) 确保环境变量 PYTHONPATH 指向父目录 (be),然后才调用您的脚本

    例子:

    export PYTHONPATH=/absolute/path/to/be
    

    3.) 将__init__.py 文件添加到目录 alembic 并从be 目录中调用您的脚本。 python -m alembic.env

    4.) 将__init__.py 与 3.) 类似,并将一个小包装脚本添加到 be 目录并从 be 调用该脚本,然后此脚本将导入 alembic.env 并将其称为“主”函数.

    如果我的建议不够明确,请随时与我联系。

    我不知道你的上下文,但我通常更喜欢 3.) 和 4.),因为没有人需要知道环境变量或系统路径更改。

    【讨论】:

    • 或者只是将 env.py 移动到 be 目录
    猜你喜欢
    • 2018-11-10
    • 2021-04-22
    • 2020-10-19
    • 2016-12-12
    • 2019-11-10
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2019-05-31
    相关资源
    最近更新 更多