PYTHONPATH与重叠包结构的烦恼
我在Windows XP上遇到了Python路径的问题,不知道自己是不是做错了什么。
假设我有一个项目(用Pydev创建的),里面有一个src
目录。在这个src
目录下,我有一个叫common
的包,里面有一个类模块,叫service.py
,这个模块里有一个类,叫Service
。
现在假设我还有另一个项目(也是用Pydev创建的),同样有一个src
目录和一个common
包。在这个common
包里,我有一个脚本client.py
,它需要导入service
。
换句话说,这两个项目在不同的地方,但它们使用的是同一个包。
我发现即使我把PYTHONPATH
设置为包含这两个src
目录,导入还是会失败,除非这两个文件在同一个目录下。我总是收到“找不到模块”的错误。
我是不是对Python如何解析模块名有误解?我之前习惯了Java的类路径问题。
3 个回答
如果你像这样进行导入:
import src.common.service
Python 会在它的路径中查找一个名为 "src" 的文件夹(或者其他类似的东西)。一旦找到第一个 "src" 文件夹,Python 就不会再去找其他的了。如果第一个 "src" 文件夹里面没有你需要的 "common" 和 "service" 这两个东西,那么你就会遇到 ImportError 错误,即使路径中还有其他的 "src" 文件夹里面有这些东西。
我觉得在Python中,最好的办法就是给每个包起个独特的名字,避免出现这个问题。不要把两个包都命名为common
。这样你就可以用类似下面的方式同时导入这两个包:
import common1.service as cs
import common2.client as cc
如果你真的需要像这样的分包,建议你了解一下模块级别的属性 __path__。
简单来说,你可以把其中一个 'src' 目录设为主要目录,并给它一个 __init__.py 文件,这个文件会把其他 'src' 的路径添加到 __path__ 列表中。这样,Python 在查找 'src' 的子模块时,就会同时在两个地方查找。
不过,我不太推荐长期使用这种方法。因为它有点脆弱,如果你移动了文件,可能就会出问题。