我想从同一目录中的另一个文件导入一个函数.
有时它适用于我,from .mymodule import myfunction但有时我会得到:
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
有时它适用from mymodule import myfunction,但有时我也得到:
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
我不明白这里的逻辑,我找不到任何解释.这看起来完全随机.
有人可以向我解释这一切背后的逻辑是什么吗?
我想继承一个位于当前目录之上的文件中的类.
是否可以相对导入该文件?
我正在使用Flask 蓝图功能创建模块化应用程序.结果,我的目录结构是这样的:
project
__init__.py
config.py
mould.py
modules
__init__.py
core
__init__.py
core.py
db.py
models.py
Run Code Online (Sandbox Code Playgroud)
这里的modules目录不会与Python模块混淆,它们用于为我的项目提供模块化结构(核心模块,foo模块,条形模块等).现在,模块目录中的每个文件夹(以及其中包含相同名称的模块core.core)都可以通过以下方式动态导入到我的主烧瓶app(mould.py)中:
for item in os.listdir("modules"):
if not os.path.isfile("modules" + os.sep + item) and not item.startswith("__"):
ppath = "modules" + "." + item
fullpath = "modules" + "." + item + "." + item
module = importlib.import_module(fullpath)
app.register_blueprint(module.app)
print("Registered: " + ppath)
Run Code Online (Sandbox Code Playgroud)
因此,我无法在模块脚本中执行此操作,例如db.py:
import models
Run Code Online (Sandbox Code Playgroud)
因为它在项目级别执行整个模块时会产生路径错误,所以我必须这样做:
from . import models
Run Code Online (Sandbox Code Playgroud)
这解决了这个问题,我能够成功导入所有模块.但是,当我进入核心模块目录进行一些故障排除并启动python解释器时,它不允许我导入db模块:
>>> import db
Traceback (most recent call last):
File "<stdin>", …Run Code Online (Sandbox Code Playgroud) Python从一级目录导入模块的正确方法是什么?该目录是一个包含所有这些模块的Python包,我有一个子目录,其中包含需要这些模块的代码.
以下工作正常,但这只是一个黑客.我想要推荐/ pythonic方式.
import sys
sys.path.append("../")
from fruit import Fruit
print("OK")
Run Code Online (Sandbox Code Playgroud)
目录结构:
pkg1
__init__.py
fruit.py
+sub_pkg
__init__.py
recipe.py
Run Code Online (Sandbox Code Playgroud)
fruit.py的内容
class Fruit:
def get_name(self):
print("Fruit name")
Run Code Online (Sandbox Code Playgroud)
sub_pkg/recipe.py..的内容只是一个导入行:
from fruit import Fruit
Run Code Online (Sandbox Code Playgroud)
当我跑:
python recipe.py
Run Code Online (Sandbox Code Playgroud)
它给出了以下错误.
Traceback (most recent call last):
File "recipe.py", line 2, in <module>
from fruit import Fruit
ImportError: No module named fruit
Run Code Online (Sandbox Code Playgroud)
我也试过:from pkg1.fruit import Fruit,不行.还看了其他类似的问题..
python -m recipe.py 或python -m sub_pkg/recipe.py没有奏效.
我试图弄清楚如何以编程方式执行包含相对导入的模块。
伪代码
spec = importlib.util.spec_from_file_location(name, path)
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
Run Code Online (Sandbox Code Playgroud)
其中 name 是类,path 是 .py 的绝对路径
当正在加载的模块包含相对导入时,对 exec_module 的调用将引发以下异常:
尝试在没有已知父包的情况下进行相对导入
有没有办法以编程方式执行本身包含相对导入的 python 模块?如果是这样,怎么办?
from ..box_utils import decode, nms
Run Code Online (Sandbox Code Playgroud)
该行显示错误
ImportError:尝试相对导入,没有已知的父包
这是什么错误,以及如何解决该错误?