【问题标题】:How to import a module from a different folder?如何从不同的文件夹导入模块?
【发布时间】:2018-08-08 21:58:51
【问题描述】:

我有一个项目,我想这样组织:

myproject
  __init__.py
  api
    __init__.py
    api.py
  backend
    __init__.py
    backend.py
  models
    __init__.py
    some_model.py

现在,我想在api.pybackend.py 中导入模块some_model.py。我该如何正确地做到这一点?

我试过了:

from models import some_model

但是 ModuleNotFoundError: No module named 'models' 失败。

我也试过了:

from ..models import some_model

这给了我ValueError: attempted relative import beyond top-level package

我在这里做错了什么?如何从不同的目录(不是子目录)导入文件?

【问题讨论】:

    标签: python python-3.x python-packaging


    【解决方案1】:

    首先,这个import语句:

    from models import some_model
    

    应该命名空间:

    # in myproject/backend/backend.py or myproject/api/api.py
    from myproject.models import some_model
    

    然后你需要将包含myproject的目录,我们称之为/path/to/parent,放入sys.path列表中。您可以通过设置环境变量来临时执行此操作:

    export PYTHONPATH=/path/to/parent
    

    或者,最好,您可以通过编写setup.py 文件并安装您的包来实现。遵循PyPA 包装指南。从同一目录中编写 setup.py 文件后,执行此操作以在 sys.path 中设置正确的条目:

    pip install --editable .
    

    【讨论】:

    • 这将起作用,但您也应该能够从 OP 尝试过的 myproject 包中进行相对导入。什么会导致它不起作用?
    • Relative imports for the billionth time 已经报道了十亿次,所以我不再赘述。
    • 您认为 OP 将 api.py 作为脚本运行?这可以解释它,是的
    • 我创建了一个包并按照建议使用 pip install --editable 安装了它。像魅力一样工作,谢谢!
    • @alper 应该没有必要。可编辑安装的全部意义在于您可以直接编辑已安装的代码。
    【解决方案2】:

    不幸的是,如果您的文件位于系统路径中,Python 只会找到您的文件。但不要害怕!有办法解决这个问题!

    使用 python 的sys 模块,我们可以在 Python 正在运行的同时将目录添加到路径中,一旦 Python 停止运行,它将从路径中删除。

    您可以这样做:

    import sys
    sys.path.insert(0, '/path/to/application/app/folder')
    import [file]
    

    在导入文件之前导入 sys 并设置目录路径很重要。

    祝你好运!

    约旦。

    【讨论】:

    • 从代码中更改路径虽然可行,但很麻烦而且很糟糕 - 它使测试设置更加困难,并使导入顺序变得重要。
    猜你喜欢
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2013-01-18
    相关资源
    最近更新 更多