我的项目有pydev项目向导创建的root src文件夹。 Src文件夹位于项目的python路径中。在该文件夹下面,我有一个包(带有__init__.py
的文件夹),包含两个文件:a.py
和b.py
。 b.py
正在尝试从a.py
导入,但我收到了未解决导入的错误。
我能够通过将该子文件夹显式添加到项目的python路径作为附加的src文件夹来“修复”错误。现在我在pythonpath中有两个文件夹作为src文件夹。我不明白的是,为什么pydev无法解析导入,因为我正在谈论的包/文件夹直接位于python路径下的root src文件夹下。 root src文件夹中没有python文件。
如果我将__init__.py
添加到root src文件夹,问题仍然存在。我只需要将子文件夹添加到pythonpath就可以使错误消失。
我做错了吗?这似乎不对。
修改 我错了。我的导入语法不正确。我应该这样做:从 package.module 导入一些而不是从模块导入一些东西
答案 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而言,b
和pkg.b
将成为不同的模块,因此顶级代码最终可以运行两次,最终可以得到所有的两个单独的副本全局(即使你认为“我不使用全局变量”,你可能是as-classes和函数都是全局变量,你很容易就会出现b.MyClass(3) != pkg.b.MyClass(3)
出乎意料的情况,调试总是很有趣...... )等等。
将__init__.py
添加到src
也是一个坏主意。这会将src
转换为一个包,这意味着b
的正确限定名称现在是src.pkg.b
,而不是pkg.b
,但是没有办法以正确的名称导入它(除非src
的父目录恰好位于sys.path
以及src
...在这种情况下,您遇到与上一段完全相同的问题。)