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

通常,以下工作之一:

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

这是为什么?


当前回答

以下解决方案在Python3上进行了测试

├── classes
|   |
|   ├──__init__.py
|   | 
│   ├── userclass.py
|   |   |
|   |   └--viewDetails()
|   |       
|   | 
│   └── groupclass.py
|       | 
|       └--viewGroupDetails()
|   
└── start.py
     └~~ uses function1()

现在,为了使用userclass的viewDetails或groupclass的viewGroupDetails,首先在无类目录的_init_.py中定义它。

示例:In_init_.py

from .userclasss import viewDetails

from .groupclass import viewGroupDetails

步骤2:现在,在start.py中,我们可以直接导入viewDetails

示例:在start.py中

from classes import viewDetails
from classes import viewGroupDetails

其他回答

我需要从主项目目录运行python3才能使其正常工作。

例如,如果项目具有以下结构:

project_demo/
├── main.py
├── some_package/
│   ├── __init__.py
│   └── project_configs.py
└── test/
    └── test_project_configs.py

解决方案

我将在文件夹project_demo/中运行python3,然后执行

from some_package import project_configs

对于PyCharm用户:

我还收到了ImportError:尝试在没有已知父包的情况下进行相对导入,因为我正在添加。表示法来消除PyCharm解析错误。PyCharm错误地报告无法找到:

lib.thing导入函数

如果您将其更改为:

.lib.thing导入函数

它会使错误静音,但随后会出现前面提到的ImportError:尝试相对导入,但没有已知的父包。忽略PyCharm的解析器。这是错误的,代码运行良好,尽管它说了什么。

太长,读不下去了通过在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中运行项目了!!

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

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

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

希望有帮助。