【问题标题】:How does python library handle internal imports?python库如何处理内部导入?
【发布时间】:2018-12-20 06:54:35
【问题描述】:

考虑以下目录

myProject
    myCode.py
    __init__.py
myProject2
    __init__.py
    myProject2Inner
         myCode.py
         __init__.py

myLibrary
    __init__.py
    myPackage1
        __init__.py
        myPackage1Code.py
    myPackage2
        __init__.py
        myPackage2Code.py

如果myCode.py 依赖于myPackage1Code.pymyPackage1Code.py 依赖于myPackage2Code.py

我目前正在做以下事情

sys.path.append(os.path.abspath('../myLibrary/myPackage2/'))
import myPackage2Code

myPackage1Code.py 中使代码运行成功。但这显然非常糟糕,因为库导入路径完全取决于谁在使用它。例如,如果myProject2Inner 需要myPackage1,那么上面的代码将不起作用。

我不得不这样做

sys.path.append(os.path.abspath('../../myLibrary/myPackage2/'))
import myPackage2Code

我认为我在这里做错了什么,有人可以指出如何在自包含库中处理导入路径的方向吗?

【问题讨论】:

标签: python python-2.7


【解决方案1】:

在您的情况下,myLibrarymyPackage1myPackage2 是包。要从其他包中导入模块(或包),您必须使用绝对路径或相对路径:

# in myPackage1Code.py
# absolute import
from myLibrary.myPackage2 import myPackage2Code
# relative import
from ..myPackage2 import myPackage2Code

这唯一地标识了您真正想要的模块,并告诉 Python 在哪里可以找到它。请注意,... 不是文件系统操作:它们也适用于动态组合的命名空间包。

如果要执行包中包含的脚本,请将其作为包的一部分执行:

python2 -m myLibrary.myPackage1.myPackage1Code

Python2 也有 implicit 相对导入:

# in myLibrary/__init__.py
from myPackage2 import myPackage2Code

一般不鼓励这种形式,因为如果存在全局myPackage2,它就会中断。它也不适用于 Python3。


请注意,要使包正常工作,您必须这样使用它们!如果您直接访问包的一部分(不要在家里这样做!

 # directly run code module of a package in the shell
 python2 myLibrary/myPackage1/myPackage1Code.py


 # directly import module of a package
 sys.path.append(os.path.abspath('../../myLibrary/myPackage2/'))
 import myPackage2Code

那么 Python 不知道 myPackage2Code 属于 myLibrary.myPackage2。 这有两个显着的效果:

  • myPackage2Code 不能使用相对导入。 Python 将其视为顶级模块,因此导入不能在包层次结构中“向上”。
  • 如果另一个模块以其完整路径导入它,这将创建两个单独的模块myPackage2CodemyLibrary.myPackage2.myPackage2Code。由于它们包含单独的对象,例如,它们无法通过 isinstance 检查 except 子句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 2011-01-27
    • 1970-01-01
    • 2011-05-27
    相关资源
    最近更新 更多