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