无法在模块外部的脚本中导入 python 模块

问题描述

我正在按以下方式构建一个项目:

repo-name/
   .venv
   src/
      __init__.py
      module1.py
      module2.py
   scratches/
      script1.py
   poetry.lock
   pyproject.toml

在script1.py中,我想使用module1.py和module2.py中定义的类,因此文件看起来像:

#repo-name/scratches/script1.py

import src.module1 as m1

我使用 Pycharm 作为 IDE,并且我已将 src 标记为源目录。如果我在 Pycharm 中运行 script1.py,则不会出现任何错误。但是,如果我导航到 repo-name/scratches/ 并运行 poetry shell 然后运行 ​​python script1.py,我会收到以下错误

ModuleNotFoundError: No module named 'src'
   

绝对导入不能从 repo-name 开始,因为仓库名称中有“-”。

有没有什么解决方案可以在不改变存储库结构的情况下运行脚本?

解决方法

解决方案

你可以这样做:

import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__),'..'))
sys.path.append(os.path.dirname(__file__))

将此代码放在脚本的顶部,在其他导入之前。

说明

使用 sys.path.append(),您可以将任何文件夹/目录添加到 sys.path 列表中。当您导入内容时,解释器会在此列表中查找模块和包。因此,您可以向其中添加自己的 src 路径并使导入工作。

此外,我使用了一些 os 工具,例如 os.path.dirnameos.path.join 结合 __file__ 变量来自动添加 ./../ 目录(其中 {{1 }} 是)和 src 目录(脚本所在的位置)。