我想从位于当前目录之上的文件中的类继承。
是否可以相对导入该文件?
我想从位于当前目录之上的文件中的类继承。
是否可以相对导入该文件?
当前回答
Python是一个模块化的系统
Python不依赖于文件系统
要可靠地加载python代码,请将该代码放在一个模块中,并将该模块安装在python的库中。
安装的模块总是可以使用import <name>从顶级命名空间加载
这里有一个很好的示例项目:https://github.com/pypa/sampleproject
基本上,你可以有一个这样的目录结构:
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.
.
确保在setup.py中声明setuptools.setup(),
官方示例:https://github.com/pypa/sampleproject/blob/master/setup.py
在我们的例子中,我们可能想要导出bar.py和foo/__init__.py,我的简单例子:
setup . py
#!/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,你可以在编辑模式下将_foo_project安装到python库中, 这样我们就能实时处理了
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_modules和包
foo_script.py
#!/usr/bin/env python3
import bar
import foo
print(dir(bar))
print(dir(foo))
其他回答
现在是2022年,没有一个答案真的对我有用。下面是最后奏效的方法
import sys
sys.path.append('../my_class')
import my_class
我的目录结构:
src ——my_class.py 笔记本电脑 ——mynotebook.ipynb
我从mynotebook.ipynb导入my_class。
您可以使用sys.path.append()方法将包含包的目录添加到搜索模块的路径列表中。例如,如果包位于当前目录以上两个目录,您可以使用以下代码:
import sys
sys.path.append("../../")
如果包位于当前目录上方的一个目录,你可以使用下面的代码:
import sys
sys.path.append("..")
@alex-martelli用pathlib优化的答案:
import pathlib
import sys
_parentdir = pathlib.Path(__file__).parent.parent.resolve()
sys.path.insert(0, str(_parentdir))
import module_in_parent_dir
sys.path.remove(str(_parentdir))
Python是一个模块化的系统
Python不依赖于文件系统
要可靠地加载python代码,请将该代码放在一个模块中,并将该模块安装在python的库中。
安装的模块总是可以使用import <name>从顶级命名空间加载
这里有一个很好的示例项目:https://github.com/pypa/sampleproject
基本上,你可以有一个这样的目录结构:
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.
.
确保在setup.py中声明setuptools.setup(),
官方示例:https://github.com/pypa/sampleproject/blob/master/setup.py
在我们的例子中,我们可能想要导出bar.py和foo/__init__.py,我的简单例子:
setup . py
#!/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,你可以在编辑模式下将_foo_project安装到python库中, 这样我们就能实时处理了
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_modules和包
foo_script.py
#!/usr/bin/env python3
import bar
import foo
print(dir(bar))
print(dir(foo))
@gimel's answer is correct if you can guarantee the package hierarchy he mentions. If you can't -- if your real need is as you expressed it, exclusively tied to directories and without any necessary relationship to packaging -- then you need to work on __file__ to find out the parent directory (a couple of os.path.dirname calls will do;-), then (if that directory is not already on sys.path) prepend temporarily insert said dir at the very start of sys.path, __import__, remove said dir again -- messy work indeed, but, "when you must, you must" (and Pyhon strives to never stop the programmer from doing what must be done -- just like the ISO C standard says in the "Spirit of C" section in its preface!-).
下面是一个可能对你有用的例子:
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