pydev - 如何避免将子目录添加到python路径以修复未解决的导入问题

时间:2013-08-29 21:46:58

标签: python pydev

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

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

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

我做错了吗?这似乎不对。

修改 我错了。我的导入语法不正确。我应该这样做:从 package.module 导入一些而不是从模块导入一些东西

1 个答案:

答案 0 :(得分:3)

很难从你的描述中得知,实际代码会有所帮助,但我怀疑你所寻找的是相对重要的。

如果你有一个文件pkg/a.py就是这样做的:

import b

这会在sys.path名为b.py的某个地方寻找顶级模块。

但如果你这样做:

from . import b

然后它会查找({em>仅内)pkg内的b.py文件。


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

import pkg.b
from pkg import b

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

__init__.py添加到src也是一个坏主意。这会将src转换为一个包,这意味着b的正确限定名称现在是src.pkg.b,而不是pkg.b,但是没有办法以正确的名称导入它(除非src的父目录恰好位于sys.path以及src ...在这种情况下,您遇到与上一段完全相同的问题。)


有关更多详细信息,请参阅PEP 328;有关更简单的概述,请参阅Packages上的教程部分。