【问题标题】:Conflict while importing packages in Python在 Python 中导入包时发生冲突
【发布时间】:2016-05-30 09:50:43
【问题描述】:

我有两个项目,每个项目都有一个 Python 文件夹,其中我有另一个名为 lib_py 的文件夹,其中包含一些共享库 Python 文件。 请注意,即使 lib_py 是一组共享库,每个项目都可以拥有旧/新版本的 lib_py 文件(根据其需要)。这就是为什么每个项目都需要有它的 lib_py 文件夹的原因。层次结构如下:

Project1
  Python
    lib_py
      __init__.py
      example.py
    main
      main.py
Project2
  Python
    lib_py
      __init__.py
      example.py
    main
      main.py

在两个项目的main.py中,example.py的导入如下:

from lib_py.example import x

为了让每个 main.py 都可以访问 example.py,我在 sys.paths 中附加了以下两个路径:

D:\Project1\Python
D:\Project2\Python

问题发生在这里:调用了 Project1 的 main.py,使用了好的 example.py,但是当从 Project1 调用 main.py 之后,又调用了 Project2 的 main.py,再次调用了 Project1 的 example.py虽然我希望使用 Project2 中的 example.py。

如果发现有几个同名的包,有什么方法可以确定应该使用哪个包? 您认为还有其他解决方案吗? (当然不改变目录层次结构)

谢谢

【问题讨论】:

    标签: python


    【解决方案1】:

    你可以这样做

    参考this answer

    from os import path
    import sys
    sys.path.append(path.abspath('../Foo'))
    sys.path.append(path.abspath('../Foo2'))
    
    
    from Project1.python.lib_py import example  as proj1ex
    from Project2.python.lib_py import example  as proj2ex
    

    【讨论】:

    • 我为 Arun G 的建议写的同样的评论:问题是我在这里描述的方案是现实的非常简单的版本。事实上,Project1 和 Project2 中的层次结构更复杂(很多文件夹级别),并且每个项目中有更多的文件夹。项目不仅是 Python 项目,而且是 C++。所以如果我使用你建议的解决方案,首先我应该在很多文件夹中添加很多 __ init __.py,其次导入会更复杂,因为有很多级别。
    • 除了使用 sys.path.append,还可以将 Project1 和 Project2 的父目录添加到 PYTHONPATH 中
    【解决方案2】:

    只需给出项目级别的路径并用其他名称为其别名

    from project1.python.lib_py import example as ex1
    from project2.python.lib_py import example as ex2
    

    开始使用 ex1 和 ex2

    【讨论】:

    • 问题是我这里描述的方案是非常简单的现实版。事实上,Project1 和 Project2 中的层次结构更复杂(很多文件夹级别),并且每个项目中有更多的文件夹。项目不仅是 Python 项目,而且是 C++。所以如果我使用你建议的解决方案,首先我应该在很多文件夹中添加很多 __ init __.py,其次导入会更复杂,因为有很多级别。
    • 不幸的是。您需要明确提及它们。我的意思是他们所有人!
    猜你喜欢
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 2012-02-23
    相关资源
    最近更新 更多