3

我的项目有 pydev 项目向导创建的根 src 文件夹。Src 文件夹位于项目的 python 路径中。在该文件夹下,我有一个__init__.py包含两个文件的包(带有 的文件夹):a.pyb.py. b.py正在尝试从中导入,a.py但我收到未解决导入的错误。

通过将该子文件夹显式添加到项目的 python 路径作为附加的 src 文件夹,我能够“修复”错误。现在我在 pythonpath 中有两个文件夹作为 src 文件夹。我不明白的是,为什么 pydev 无法解析导入,因为我正在谈论的包/文件夹直接位于 python 路径中的根 src 文件夹下。根 src 文件夹中没有 python 文件。

如果我添加__init__.py到根 src 文件夹,问题仍然存在。我只需要将子文件夹添加到 pythonpath 以消除错误。

难道我做错了什么 ?这似乎不对。

编辑: 我错了。我的导入语法不正确。我应该这样做: from package.module import someting 而不是 from module import something

4

1 回答 1

3

从您的描述中很难分辨,实际代码会有所帮助,但我怀疑您正在寻找的是相对导入。

如果您有一个文件pkg/a.py可以做到这一点:

import b

sys.path这将在您命名的某个地方寻找一个顶级模块b.py

但如果你这样做:

from . import b

然后它将在内部(并且在内部)pkg查找名为b.py.


或者,您可以使用绝对导入,就像在包外的模块中一样,例如以下之一:

import pkg.b
from pkg import b

由于多种原因,您尝试添加pkg的解决方法是一个非常糟糕的主意。sys.path例如,就 Python 而言, bandpkg.b将成为不同的模块,因此顶级代码最终可能会运行两次,您最终可能会得到所有全局变量的两个单独副本(即使您认为“我” m 不使用全局变量”,你可能是——类和函数是全局变量,你很容易遇到b.MyClass(3) != pkg.b.MyClass(3)意外情况,调试总是很有趣……)等等。

添加__init__.pytosrc也是一个坏主意。这变成src了一个包,这意味着正确的限定名称b是 now src.pkg.b,而不是pkg.b,但是没有办法以正确的名称导入它(除非父目录src恰好是 onsys.path以及src… 在这种情况下你有确切的与上段相同的问题)。


有关更多详细信息,请参阅PEP 328 ,以及有关的教程部分以获得更简单的概述。

于 2013-08-29T21:50:27.723 回答