我在Windows XP上遇到了PythonPath问题,我想知道自己是否做错了。
假设我有一个项目(使用Pydev创建),其中包含src
目录。在src
下,我有一个名为common
的程序包,其中包含一个名为service.py
且类名为Service
现在说我有另一个项目(也是用Pydev创建的),带有src
目录和一个公共包。在公共包中,我有一个导入服务的脚本client.py
。
换句话说,两个单独的磁盘位置,但相同的包。
我注意到即使我将PYTHONPATH
设置为包含两个src目录,导入也会失败,除非文件都在同一目录中。我找到了可怕的没有模块。
我是否误解了python如何解析模块名称?我已经习惯了Java及其类路径地狱。
答案 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”目录确实有这些东西。