【问题标题】:Python trying to import a folder as a modulePython试图将文件夹作为模块导入
【发布时间】:2021-01-28 07:39:44
【问题描述】:

我遇到一个奇怪的错误,当我尝试从子文件夹中的文件导入一个类时,我得到一个ModuleNotFoundError

from petri.strategyport.strategy import Strategy
ModuleNotFoundError: No module named 'petri.strategyport'

strategyport 文件夹不包含__init__.py,我使用的是 python 3.8。此外,petri 模块可以在其他环境中工作(当我遇到错误时,我试图从 NixOS shell 运行它)。 sys.path 包含 petri 模块的根文件夹。谁能告诉我这里可能出了什么问题?看起来很神秘。

在此先感谢您的帮助,也感谢活动结束后的帮助。

编辑:这里的文件结构如下所示:

petri/
    __init__.py
    /strategyport/
        strategy.py

__init__.py 的位置有 from petri.strategyport.strategy import Strategy

进一步的编辑: 在这个包中实际上还有许多其他的导入,例如from petri.asset import Asset,等等。所有单级(即它们在根目录级别,而不是在它们自己的子文件夹中)都可以工作,而多级都不能。因此,这里似乎存在一些基本问题,python 将子文件夹误认为模块。将导入语法从 from petri.xxxx.yyyy import zzzz 切换到 from xxxx.yyyy import zzzz 没有任何区别。

【问题讨论】:

  • 请在您的问题中画出文件夹树

标签: python python-import nix


【解决方案1】:

你应该写from strategyport.strategy import Strategy

【讨论】:

  • 谢谢 - 不幸的是这不起作用。该包实际上导入了很多其他格式为 petri.xxxx 的文件 - 我已经编辑了我的原始帖子以使事情更清楚。
【解决方案2】:

改变

from petri.strategyport.strategy import Strategy

from strategyport.strategy import Strategy

不需要包含petri 目录。因为您的 __init__.py 脚本已经在该目录中。所以你只需要写strategyport.strategy就足够了。

或者

您可以将petri的父目录添加到path

import sys
sys.path.insert(1, '/path/to/parent/of/petri/')
from petri.strategyport.strategy import Strategy

【讨论】:

  • 谢谢 - 我已经尝试过了,但不幸的是它不起作用,请参阅对原始问题的编辑。
  • @ChrisJHarris 我也编辑了我的答案。请检查现在是否可以。
  • 谢谢 - 我已经试过了 - 从我的问题来看,'sys.path 中包含 petri 模块的根文件夹。'
  • @ChrisJHarris 我的错。起初我错过了parent 部分。请将petriparent目录添加到sys.path
  • 谢谢 - 我已经尝试过了,但不幸的是没有成功。这似乎是一个特别奇怪的问题。
猜你喜欢
  • 2013-08-26
  • 2014-01-08
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2017-06-07
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多