2022年的答案
以下是2022年的一个潜在方法。问题确定无误,如果您使用类似VS Code这样的IDE,它不会自动扩展python路径和发现模块。
一种方法是使用一个.env文件,它将自动扩展python路径。我反复使用了这个网站k0nze.dev找到答案,实际上还发现了另一个解决方案。
以下是k0nze.dev解决方案提供的缺点:
- 它只通过launch.json文件扩展python路径,这在此情况下不影响在调试器外运行python
- 您只能在launch.json中的“env”变量中使用${workspaceFolder}和其他变量,该变量被存在.env文件的优先权覆盖。
- 该解决方案仅适用于VS Code,因为它必须写在launch.json中(-总体可移植性差)
.env文件
在你的例子中,
tests 位于它自己的目录下,并且有它自己的
init.py。在像 VS Code 这样的 IDE 中,它不会自动发现这个目录和模块。你可以通过在项目中任何位置创建以下脚本并运行它来查看这一点:
_path.py
from sys import path as pythonpath
print("\n ,".join(pythonpath))
你不应该看到你的 ${workspaceFolder}/tests/,如果你看到了,那是因为你的 _path.py 脚本位于该目录中,而 Python 会自动将脚本路径添加到 pythonpath 中。要解决整个项目中的这个问题,你需要使用 .env 文件扩展 Python 路径,以覆盖项目中的所有文件。
为此,请使用点表示法来指示你的 ${workspaceFolder},而不能实际使用 ${workspaceFolder}。你必须使用点表示法,因为 .env 文件不会像 ${workspaceFolder} 那样进行变量赋值。你的 env 文件应该如下所示:
Windows
PYTHONPATH = ".\\tests\\;.\\"
Mac / Linux / 等等
PYTHONPATH = "./tests/:./"
其中:
- ; 和 : 分别是 Windows 和 Mac 环境变量的路径分隔符
- ./tests/ 和 .\tests\ 将 Python 路径扩展到模块 tests 中的文件,以便在 init.py 中导入
- ./ 和 .\ 将 Python 路径扩展到模块 tests 和可能的 solutions?我不知道 solutions 是否是一个模块,但我会继续运行。
测试一下
现在重新运行您的 _path.py 脚本,您应该看到对您的路径进行了永久添加。如果您的公司有更严格的项目结构,这也适用于深度嵌套的模块。
VS Code
如果您正在使用 VS Code,则无法在 .env 文件中使用由 VS Code 提供的环境变量。这包括 ${workspaceFolder},它非常方便地将文件路径扩展到您当前打开的文件夹。我已经试图找出为什么它没有将这些环境变量添加到路径中很长时间了,看来
解决方案是使用点表示法通过使用相对文件路径来添加路径。这允许用户将文件路径附加到项目结构而不是自己的文件结构。
其他IDE
上述内容是针对VS Code编写的,因为它每次运行Python文件时都会自动读取.env文件。这个功能非常方便,除非你的IDE也有此功能,否则你需要使用dotenv包来帮助你。
实际上,你可以通过在首选项中搜索以下设置来查看你的VS Code版本正在查找的位置:
VSCode settings env file
无论如何,要安装需要导入.env文件的包,请运行:
pip install python-dotenv
在您的Python脚本中,需要运行并导入以下内容,以使它加载.env文件作为您的环境变量:
from dotenv import load_dotenv()
load_dotenv()
"""
The rest of your code here
"""
就是这样
恭喜你到达了底部。当我去解决这个问题时,这个主题几乎让我发疯,但我认为详细说明并理解问题以及如何解决它是有帮助的,而不是使用 hacky sys.path appends 或绝对文件路径。这也为您提供了一种测试路径上的内容以及解释为什么在项目结构中添加每个路径的方法。