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

通常,以下工作之一:

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

这是为什么?


当前回答

将要导入的文件移动到外部目录有帮助。当主文件在其自己的目录中生成任何其他文件时,这是非常有用的。前任:之前:

Project  
|---dir1  
|-------main.py  
|-------module1.py  

之后:

Project  
|---module1.py  
|---dir1  
|-------main.py  

其他回答

太长,读不下去了通过在python脚本的入口点添加以下内容,将脚本路径附加到系统路径。

import os.path
import sys
PACKAGE_PARENT = '..'
SCRIPT_DIR = os.path.dirname(os.path.realpath(os.path.join(os.getcwd(), os.path.expanduser(__file__))))
sys.path.append(os.path.normpath(os.path.join(SCRIPT_DIR, PACKAGE_PARENT)))

现在,您可以在PyCharma和Terminal中运行项目了!!

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

from example.example import fkt

为了避免这个问题,我设计了一个重新包装包装的解决方案,这对我来说已经奏效了一段时间。它将上层目录添加到lib路径:

import repackage
repackage.up()
from mypackage.mymodule import myfunction

使用智能策略(检查调用堆栈),重新打包可以在各种情况下进行相对导入。

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

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

希望有帮助。

将要导入的文件移动到外部目录有帮助。当主文件在其自己的目录中生成任何其他文件时,这是非常有用的。前任:之前:

Project  
|---dir1  
|-------main.py  
|-------module1.py  

之后:

Project  
|---module1.py  
|---dir1  
|-------main.py