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

通常,以下工作之一:

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

这是为什么?


当前回答

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

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

希望有帮助。

其他回答

将其放入包的__init__.py文件中:

# For relative imports to work in Python 3.6
import os, sys; sys.path.append(os.path.dirname(os.path.realpath(__file__)))

假设您的包是这样的:

├── project
│   ├── package
│   │   ├── __init__.py
│   │   ├── module1.py
│   │   └── module2.py
│   └── setup.py

现在在您的包中使用常规导入,例如:

# in module2.py
from module1 import class1

这在python 2和3中都有效。

我认为最好的解决方案是为您的模块创建一个包:这里有更多关于如何做的信息。

一旦你有了一个包装,你就不必担心相对进口,你只需要做绝对进口。

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

以下解决方案在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

我有一个类似的问题,并通过在工作目录中创建一个指向包的符号链接来解决:

在-s../../..中/我的包我的包

然后照常导入:

导入my_package

我知道这更像是“Linux”解决方案,而不是“Python”解决方案。但这仍然是一种有效的方法。