【问题标题】:PYTHONPATH hell with overlapping package structures包结构重叠的 PYTHONPATH 地狱
【发布时间】:2010-07-27 18:05:23
【问题描述】:

我在 Windows XP 上的 PythonPath 出现问题,我想知道我是否做错了什么。

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

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

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

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

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

【问题讨论】:

    标签: python pythonpath


    【解决方案1】:

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

    简而言之,将 'src' 目录之一设为主要目录,并为其提供一个 __init__.py,将其他 'src' 的路径附加到 __path__ 列表中。 Python 现在在查找 'src' 的子模块时会同时查找这两个位置。

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

    【讨论】:

      【解决方案2】:

      我认为在 Python 中,最好通过为每个包提供唯一名称来避免这个问题。不要将两个包都命名为common。然后你可以用类似的东西导入两者

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

      【讨论】:

        【解决方案3】:

        如果您尝试这样导入:

        import src.common.service
        

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

        【讨论】:

        • 这是一种特殊的行为,我不得不说。在 Java 中,类路径被认为是所有将要探索的目录的分离。
        猜你喜欢
        • 2016-05-29
        • 1970-01-01
        • 2016-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多