How to import a Python class that is in a directory above?
我想从一个文件中的类继承,该类位于当前目录的上方。
是否可以相对导入该文件?
在包层次结构中,使用两个点,正如import语句文档所说:
When specifying what module to import you do not have to specify the absolute name of the module. When a module or package is contained within another package it is possible to make a relative import within the same top package without having to mention the package name. By using leading dots in the specified module or package after
from you can specify how high to traverse up the current package hierarchy without specifying exact names. One leading dot means the current package where the module making the import exists. Two dots means up one package level. Three dots is up two levels, etc. So if you executefrom . import mod from a module in thepkg package then you will end up importingpkg.mod . If you executefrom ..subpkg2 import mod from withinpkg.subpkg1 you will importpkg.subpkg2.mod . The specification for relative imports is contained within PEP 328.
PEP 328处理绝对/相对进口。
1 2 | import sys sys.path.append("..") # Adds higher directory to python modules path. |
@如果你能保证他提到的包层次结构,吉默的回答是正确的。如果你不能--如果你真正需要的是你表达的那样,只与目录绑定,并且与包装没有任何必要的关系--那么你需要处理
下面是一个可能适用于您的示例:
1 2 3 4 5 6 | import sys import os.path sys.path.append( os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) import module_in_parent_dir |
从当前目录正上方一级的目录导入模块:
1 | from .. import module |
python是一个模块化系统python不依赖文件系统
为了可靠地加载python代码,请将该代码放在模块中,并将该模块安装在python的库中。
安装的模块总是可以从顶级命名空间中使用
这里有一个很好的示例项目:https://github.com/pypa/sample project
基本上,您可以有这样的目录结构:
1 2 3 4 5 6 7 8 9 10 11 12 | the_foo_project/ setup.py bar.py # `import bar` foo/ __init__.py # `import foo` baz.py # `import foo.baz` faz/ # `import foo.faz` __init__.py daz.py # `import foo.faz.daz` ... etc. |
.
一定要在
官方示例:https://github.com/pypa/sampleproject/blob/master/setup.py
在我们的案例中,我们可能希望出口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/usr/bin/env python3 import setuptools setuptools.setup( ... py_modules=['bar'], packages=['foo'], ... entry_points={}, # Note, any changes to your setup.py, like adding to `packages`, or # changing `entry_points` will require the module to be reinstalled; # `python3 -m pip install --upgrade --editable ./the_foo_project ) |
.
现在我们可以将模块安装到python库中;使用pip,您可以在编辑模式下将
1 2 3 4 | python3 -m pip install --editable=./the_foo_project # if you get a permission error, you can always use # `pip ... --user` to install in your user python library |
.
现在,从任何Python上下文中,我们都可以加载共享的py_模块和包。
FuixScript1 2 3 4 5 6 7 | #!/usr/bin/env python3 import bar import foo print(dir(bar)) print(dir(foo)) |