Python尝试将文件夹作为模块导入

问题描述

我有一个奇怪的错误,当我尝试从子文件夹内的文件导入一个类时,我得到一个 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__.pyfrom petri.strategyport.strategy import Strategy

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

解决方法

你应该写from strategyport.strategy import Strategy

,

改变

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