具有重叠包结构的PYTHONPATH shell

具有重叠包结构的PYTHONPATH shell,python,pythonpath,Python,Pythonpath,我在windows XP上的PythonPath有问题,我想知道我是否做错了什么 假设我有一个项目(用Pydev创建),它有一个src目录。在src下,我有一个名为common的包,其中有一个名为service.py的类模块,类名为service 现在假设我有另一个项目(也是用Pydev创建的),它有一个src目录和一个公共包。在公共包中,我有一个脚本,client.py,用于导入服务 换句话说,两个独立的磁盘位置,但包是相同的 我注意到,即使我将我的PYTHONPATH设置为包含两个src目录

我在windows XP上的PythonPath有问题,我想知道我是否做错了什么

假设我有一个项目(用Pydev创建),它有一个
src
目录。在
src
下,我有一个名为
common
的包,其中有一个名为
service.py的类模块,类名为
service

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

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

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


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

我认为在Python中,最好通过为每个包提供唯一的名称来避免这个问题。不要同时命名两个软件包
common
。然后,您可以使用以下内容导入这两个

import common1.service as cs
import common2.client as cc

如果您尝试这样导入:

import src.common.service

Python将在Python路径上查找名为“src”的目录(或egg等)。一旦找到“SRC”,它将不会考虑另一个。如果第一个“src”中没有公共和服务,那么即使路径中的另一个“src”目录中有这些东西,您也会得到一个ImportError。

如果您确实必须有这样的拆分包,请阅读模块级属性uuuu path\uu

简言之,将其中一个“src”目录作为主目录,并为其指定一个_init__u; py.py,将其他“src”的路径附加到_path__;列表中。Python现在在查找“src”的子模块时会同时查找这两个位置


但我真的不推荐长期使用。它有点脆,如果你移动东西就会断裂

我不得不说,这是一种奇怪的行为。在Java中,类路径被认为是将要研究的所有目录的析取。