python库如何处理内部导入?

python库如何处理内部导入?,python,python-2.7,Python,Python 2.7,考虑以下目录 myProject myCode.py __init__.py myProject2 __init__.py myProject2Inner myCode.py __init__.py myLibrary __init__.py myPackage1 __init__.py myPackage1Code.py myPackage2 __ini

考虑以下目录

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.py并且myPackage1Code.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
我认为我在这里做了一些非常错误的事情,有人能告诉我如何在自包含库中处理导入路径吗?

在您的例子中,myLibrary、myPackage1和myPackage2都是包。要从其他包导入模块或包,必须使用绝对或相对路径:

# in myPackage1Code.py
# absolute import
from myLibrary.myPackage2 import myPackage2Code
# relative import
from ..myPackage2 import myPackage2Code
这唯一地标识了您实际需要的模块,并告诉Python在哪里可以找到它。请注意。和不是文件系统操作:它们还可以使用动态组合的命名空间包

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

python2 -m myLibrary.myPackage1.myPackage1Code
Python2还具有隐式相对导入:

# in myLibrary/__init__.py
from myPackage2 import myPackage2Code
通常不鼓励使用此表单,因为如果存在全局myPackage2,它会中断。它也不适用于Python3

请注意,要使包正常工作,您必须使用它们!如果您直接访问软件包的一部分,请不要在家中执行此操作

然后Python不知道myPackage2Code属于myLibrary.myPackage2。 这有两个显著的影响:

myPackage2Code无法使用相对导入。Python将其视为顶级模块,因此导入不能在包层次结构中上升。 如果另一个模块以其完整路径导入,则会创建两个单独的模块myPackage2Code和myLibrary.myPackage2.myPackage2Code。由于它们包含单独的对象,例如,它们无法通过except子句的isinstance检查。
如果您只是将myLibrary的路径添加到PYTHONPATH,会不会有所帮助?可能是
 # 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