我想从同一目录中的另一个文件导入一个函数。

通常,以下工作之一:

from .mymodule import myfunction
from mymodule import myfunction

…但另一个给了我一个错误:

ImportError: attempted relative import with no known parent package
ModuleNotFoundError: No module named 'mymodule'
SystemError: Parent module '' not loaded, cannot perform relative import

这是为什么?


当前回答

值得注意的是,有时是缓存导致了这一切——在将类重新排列到新目录中之后,我尝试了不同的方法,并且在删除__pycache之后,相对导入开始工作__

其他回答

值得注意的是,有时是缓存导致了这一切——在将类重新排列到新目录中之后,我尝试了不同的方法,并且在删除__pycache之后,相对导入开始工作__

如果两个包都在您的导入路径(sys.path)中,并且您想要的模块/类在example.example.py中,那么要访问该类而不进行相对导入,请尝试:

from example.example import fkt

我尝试了以上所有方法,但都没有效果,结果发现我的包名中错误地包含了-。

简而言之,在__init__.py所在的目录中不要有-。在发现这样的无意义之后,我从未感到欢欣鼓舞。

对于那些不同意圭多的人,这里有三句话:

import sys
from pathlib import Path
sys.path.append(str(Path(sys.argv[0]).absolute().parent.parent))

希望有帮助。

TL;DR:给@Aya的答案,用pathlib库更新,并为未定义__file__的Jupyter笔记本工作:

要导入在..下定义的my_function/my_Folder_where_the_package_lives/my_package.py关于您编写代码的位置。

然后执行以下操作:

import os
import sys
import pathlib

PACKAGE_PARENT = pathlib.Path(__file__).parent
#PACKAGE_PARENT = pathlib.Path.cwd().parent # if on jupyter notebook
SCRIPT_DIR = PACKAGE_PARENT / "my_Folder_where_the_package_lives"
sys.path.append(str(SCRIPT_DIR))

from my_package import my_function