我有一个项目,其中目录 A 中有一个 python(.py) 文件,在文件夹 A 下,我有一个包含代码的文件:
from utils.utils import csv_file_transform
其中 utils 是 A 的同级目录
/A
file.py
/utils
__init__.py
utils.py
但是,我收到错误 No Module named utils.utils, utils is not a package 我尝试使用 sys 添加路径,但仍然给出相同的错误
import sys
sys.path.append('C:/Users/Sri/Documents/newmod/folder/utils')
代码在ubuntu中工作正常,但在windows中不行,我使用的是windows系统
尽管我不支持仅链接/仅参考答案,但我认为通过引用现有讨论并提供有关 Python 导入机制的更广泛上下文,可以最好地回答您的问题。
您真的在致力于创建Python模块吗?如果是这种情况,那么如果您能为您的模块建立严格的结构并遵循这些准则,那就太好了。
请考虑下面的文章,作者是 Jason C. McDonald,内容是在 Python 中构建一个假设的模块 omission
。给出以下结构:
omission-git
├── LICENSE.md
├── omission
│ ├── app.py
│ ├── common
│ │ ├── classproperty.py
│ │ ├── constants.py
│ │ ├── game_enums.py
│ │ └── __init__.py
│ ├── data
│ │ ├── data_loader.py
│ │ ├── game_round_settings.py
│ │ ├── __init__.py
│ │ ├── scoreboard.py
│ │ └── settings.py
│ ├── game
│ │ ├── content_loader.py
│ │ ├── game_item.py
│ │ ├── game_round.py
│ │ ├── __init__.py
│ │ └── timer.py
│ ├── __init__.py
│ ├── __main__.py
│ ├── resources
│ └── tests
│ ├── __init__.py
│ ├── test_game_item.py
│ ├── test_game_round_settings.py
│ ├── test_scoreboard.py
│ ├── test_settings.py
│ ├── test_test.py
│ └── test_timer.py
├── pylintrc
├── README.md
└── .gitignore
Jason 将按照以下方式导入模块from omission.common.game_enums import GameMode
。
@am5 建议添加
import os, sys; sys.path.append(os.path.dirname(os.path.realpath(__file__)))
到您的 __init__.py
文件。如果您研究相关讨论,您会发现对于修改
sys.path
的看法是多种多样的。有些人可能会争论导入失败和错误,例如:
ImportError:尝试在没有已知父包的情况下进行相对导入实际上是
代码气味的指示。作为一个解决方案,我希望您不会觉得光顾,我建议您通过以下方式解决导入挑战:
a) 决定您想要进入模块化架构的“深度”的要求。 b) 采用相应的推荐架构,并对模块结构进行严格的处理 c) 避免通过sys.path
硬编码任何路径。如上所述,附加相对路径并不是完美的解决方案,但有一些优点,可能值得考虑。其他值得讨论/文物