ModuleNotFoundError:使用 sys.path.append() 时没有名为 Project 的模块

cha*_*lei 5 python

我正在尝试从父目录中的文件夹导入模型。我正在使用 sys.path.append()。我的项目结构:

-项目

  • 文件夹1
    • 文件1.py
    • ...
  • 文件夹2
    • 文件2.py
    • ...

在 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)

我知道还有其他方法,但这似乎是最简单的。我不确定是否需要将绝对路径放入项目文件夹,但我希望不需要,因为我将在不同的计算机上运行该项目(差异绝对路径)。

Nie*_*ano 6

您的代码中有 2 个错误:

\n
    \n
  1. Project目录不仅仅是上一级。从角度来看file1.py,实际上是上升了2个等级。看看这个:
  2. \n
\n
$ 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\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 即使上述方法有效,添加相对路径作为字符串实际上也会将该字符串附加为其原始值。所以如果你添加一个print(sys.path),它会显示如下内容:
  2. \n
\n
[\'/usr/lib/python38.zip\', \'/usr/lib/python3.8\', \'/usr/lib/python3.8/lib-dynload\', \'../Project\', \'.\']\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 它实际上是添加了\'../Project\',所以如果 python 开始在folder2中搜索目标模块,它仍然找不到它们,因为它如何知道确切的相对\'../Project\'位置。
  • \n
\n

解决方案

\n

您需要添加的是绝对路径。如果您的问题是它可能会改变,那很好,因为我们不需要固定的绝对路径。我们可以通过当前正在执行的文件的位置获取绝对路径file1.py,然后提取所需的父目录。因此,无论绝对路径是否改变,这都将起作用,因为我们获取它的方式始终是相对于 的file1.py。尝试这个:

\n

项目/文件夹1/文件1.py

\n
from 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\n
Run Code Online (Sandbox Code Playgroud)\n