PYTHONPATH地狱与重叠的包装结构

时间:2010-07-27 18:05:23

标签: python pythonpath

我在Windows XP上遇到了PythonPath问题,我想知道自己是否做错了。

假设我有一个项目(使用Pydev创建),其中包含src目录。在src下,我有一个名为common的程序包,其中包含一个名为service.py且类名为Service

的类模块

现在说我有另一个项目(也是用Pydev创建的),带有src目录和一个公共包。在公共包中,我有一个导入服务的脚本client.py

换句话说,两个单独的磁盘位置,但相同的包。

我注意到即使我将PYTHONPATH设置为包含两个src目录,导入也会失败,除非文件都在同一目录中。我找到了可怕的没有模块。

我是否误解了python如何解析模块名称?我已经习惯了Java及其类路径地狱。

3 个答案:

答案 0 :(得分:2)

如果你真的必须有这样的拆分包,请阅读模块级属性__path __。

简而言之,将'src'目录中的一个作为主目录,并给它一个__init__.py,将其他'src'的路径附加到__path__列表。在查找'src'的子模块时,Python现在会查看这两个地方。

我确实不建议长期这样做。如果你移动东西,它会有点脆弱和断裂。

答案 1 :(得分:1)

我认为在Python中,最好通过为每个包提供唯一名称来避免此问题。不要为两个包common命名。然后你可以用

之类的东西导入它们
import common1.service as cs
import common2.client as cc

答案 2 :(得分:1)

如果你尝试像这样导入:

import src.common.service

Python将在Python路径上查找名为“src”(或一个egg等)的目录。一旦找到“src”,它就不会考虑另一个。如果第一个“src”里面没有common和service,那么你将得到一个ImportError,即使路径中的另一个“src”目录确实有这些东西。