我正在尝试从父目录中的文件夹导入模型。我正在使用 sys.path.append()。我的项目结构:
-项目
在 file1.py 文件中:
sys.path.append('../Project')
from Project.folder2 import file2
Run Code Online (Sandbox Code Playgroud)
然后我得到:
ModuleNotFoundError: No module named Project
Run Code Online (Sandbox Code Playgroud)
我知道还有其他方法,但这似乎是最简单的。我不确定是否需要将绝对路径放入项目文件夹,但我希望不需要,因为我将在不同的计算机上运行该项目(差异绝对路径)。
您的代码中有 2 个错误:
\nProject目录不仅仅是上一级。从角度来看file1.py,实际上是上升了2个等级。看看这个:$ cd ..\n(venv) nponcian 1$ tree\n.\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Project\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 folder1\n \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 file1.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 folder2\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 file2.py\n(venv) nponcian 1$ cd Project/folder1/\n(venv) nponcian folder1$ ls ..\nfolder1 folder2\n(venv) nponcian folder1$ ls ../..\nProject\nRun Code Online (Sandbox Code Playgroud)\nprint(sys.path),它会显示如下内容:[\'/usr/lib/python38.zip\', \'/usr/lib/python3.8\', \'/usr/lib/python3.8/lib-dynload\', \'../Project\', \'.\']\nRun Code Online (Sandbox Code Playgroud)\n\'../Project\',所以如果 python 开始在folder2中搜索目标模块,它仍然找不到它们,因为它如何知道确切的相对\'../Project\'位置。您需要添加的是绝对路径。如果您的问题是它可能会改变,那很好,因为我们不需要固定的绝对路径。我们可以通过当前正在执行的文件的位置获取绝对路径file1.py,然后提取所需的父目录。因此,无论绝对路径是否改变,这都将起作用,因为我们获取它的方式始终是相对于 的file1.py。尝试这个:
项目/文件夹1/文件1.py
\nfrom pathlib import Path\nimport sys\nsys.path.append(str(Path(__file__).parent.parent.parent)) # 1. <.parent> contains this file1.py 2. <.parent.parent> contains folder1 3. <.parent.parent.parent> contains Project\n\n... the rest of the file\nRun Code Online (Sandbox Code Playgroud)\n