【问题标题】:Import a custom module in the parent folder in python在python的父文件夹中导入自定义模块
【发布时间】:2020-02-12 10:21:04
【问题描述】:

虽然我认为这应该很简单,但我仍然无法让它运行。

我有以下文件夹结构:

├── apartment          
│   ├── src        
│       ├── train_model
│           ├── __init__.py 
│           ├── train_model.py
│           ├── utils.py
│       ├── interference.py
│       └── __init__.py

utils.py我试过了:

from src.interference import create_sample

错误:ModuleNotFoundError:没有名为“src”的模块

from .interference import create_sample

错误:ImportError:尝试在没有已知父包的情况下进行相对导入

from interference import create_features_sample

ModuleNotFoundError: 没有名为“干扰”的模块

有什么方法可以让它工作?我不是非 Python 方式的忠实粉丝,因为它看起来很脏。

【问题讨论】:

  • OP,如果对您有帮助,别忘了将答案标记为有效,以帮助他人
  • 您使用什么命令来运行您的脚本?是python utils.py 还是别的什么?请编辑问题并添加它;D

标签: python


【解决方案1】:

src/ 开头的结构明确旨在启用from src.intereference import ... 导入,您不应将__init__.py 文件放在src/ 文件夹中。

相反,请在此处遵循很好的解释和示例:https://blog.ionelmc.ro/2014/05/25/python-packaging/,这是我的推荐:

  • 安装包:

    • 在文件夹的根目录下添加一个setup.py 文件(这显然不像看起来那么难)
    • 也许创建一个虚拟环境
    • 使用pip install -e .(带有尾随点!)命令
  • 然后通过from interference import ...导入你的包

要响应您的主要请求,您可以将src/__init__.py 更新为from intereference import create_sample,以在更高级别公开此功能,然后链式导入将起作用。但是,我不建议这样做,因为它会使一切变得非常僵硬。

【讨论】:

  • 那里还没有 init 吗?下面的interference.py
  • 确实有,但是结构有点奇怪,所以我建议改进。但是,我可能没有正确理解结构,所以我可能会更新我的答案。
  • 我想我们只需要回答如何从 utils 导入干扰
  • @Joël 在你对奇怪的结构发表评论后,我意识到它确实很奇怪,所以我改变了它。谢谢!
  • @Anni 很高兴我能帮上忙!如果您找到了构建项目的好方法,那么您可以创建一个新答案并在那里解释它现在的样子:)
【解决方案2】:

您需要将包含干扰的目录添加到PYTHONPATH

您可以在sys.path 中列出的“模块搜索路径”中使用取决于操作系统的路径。因此,您可以轻松添加父目录,如下所示:

import sys
sys.path.insert(0, '..')

from interference import create_features_sample

请注意,前面的代码使用相对路径,因此您必须在同一位置启动文件,否则可能无法正常工作。 要从任何地方启动,您可以使用pathlib 模块中的Path

from pathlib import Path
import sys
path = str(Path(Path(__file__).parent.absolute()).parent.absolute())
sys.path.insert(0, path)

from interference import create_features_sample

【讨论】:

  • 这只会临时添加模块。
  • 大多数情况下他们想要什么。你不想用每个随机项目污染你的 PYTHONPATH + 它会在文件启动时执行,所以我在这里看不到你的意思。
【解决方案3】:

如果您想永久添加自定义路径到您的 PYTHONPATH,请转到当前 Python 环境的“site-packages”文件夹并添加文件“custompaths.pth”,其中每行应包含一个目录,然后如果您尝试导入模块,请检查。

假设 'src' 是您要导入的模块,您应该将以下行添加到 .pth 文件中:

your_preceding_path/apartment

【讨论】:

    【解决方案4】:

    python 找不到特定文件或包导致的错误。 Python通常只查找子包或文件,否则需要指定绝对路径。

    import sys, os
    sys.path.append(os.path.abspath(os.path.join('../..', 'src')))
    

    请参考“How to access a module from outside your file folder in Python?

    【讨论】:

      【解决方案5】:

      你试过from ..interference import create_sample吗?

      或者对于整个模块from .. import interference

      我在这里检查过,我正在使用另一个命令,这是在撰写本文时问题中缺少的东西。我使用的命令是来自apartment 文件夹的python -m src.train_model.utils

      感谢RMPR 帮助我。

      这个问题和this one类似。

      【讨论】:

      • ``` 文件 "utils.py",第 2 行导入 ..interferences ^ SyntaxError: invalid syntax```
      • 干扰不是干扰
      • 我将其命名为对我的测试的干扰
      • @RMPR 应该是from .. import interference
      • 第二个我得到ImportError: attempted relative import with no known parent package ..你需要将文件夹添加到PYTHONPATH
      猜你喜欢
      • 1970-01-01
      • 2019-09-16
      • 2021-02-20
      相关资源
      最近更新 更多