我正在使用Django,有一个名为models.admin.py的文件,我想在models.py中实现以下想法:
from "models.admin" import *
然而,由于使用了双引号,我遇到了语法错误。但是如果我只是这样做
from models.admin import *
然后我收到了 "ImportError: No module named admin" 的错误信息。
有没有办法从一个带有点号的python文件中导入模块?
我正在使用Django,有一个名为models.admin.py的文件,我想在models.py中实现以下想法:
from "models.admin" import *
然而,由于使用了双引号,我遇到了语法错误。但是如果我只是这样做
from models.admin import *
然后我收到了 "ImportError: No module named admin" 的错误信息。
有没有办法从一个带有点号的python文件中导入模块?
实际上,你是可以导入一个无效名称的模块的。但你需要使用imp
来实现,例如,假设文件名为models.admin.py
,你可以这样做:
import imp
with open('models.admin.py', 'rb') as fp:
models_admin = imp.load_module(
'models_admin', fp, 'models.admin.py',
('.py', 'rb', imp.PY_SOURCE)
)
在开始使用之前,请阅读关于imp.find_module
和imp.load_module
的文档。
imp
是 import
和 __import__
的机制。它更加灵活,但需要更多的代码。虽然没有什么神奇的地方。 - Cat Plus Plus>>> import imp
>>> a_b = imp.load_source('a.b', 'a.b.py')
>>> a_b.x
"I was defined in a.b.py!"
然而,这通常是个坏主意。更有可能的情况是你想要使用包,此时你应该创建一个名为 "a" 的目录,其中包含一个名为 "b.py" 的文件;然后 "import a.b" 将会加载 a/b.py。
load_source
自 1.5 版本起已经过时。 - Cat Plus Plus假设目录结构如下:
C:.
│ script.py
│
└───Parent
└───Child
├───1.1
│ main.py
│
└───1.2
假设您想在script.py中导入main.py
您的main.py如下所示:
def my_function():
print("Hello from a function")
你的 script.py 看起来像下面这样
from os import path
import importlib
from os.path import dirname
import sys
import importlib.util
def getPath():
# your logic to get to the path
return path.join(dirname(__file__),'Parent','Child','1.1','main.py')
file_path = getPath()
module_name = 'main'
spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
#call functions like this
module.my_function()
请查看此代码片段
,它与IT技术有关。models/admin.py
。(来源)models
的目录中命名为admin.py
。from models.admin import *
进行导入,假设它在你的Python路径中。如果一个Python文件的名称包含句点(或问号、感叹号等),则无法将其作为模块导入。Python模块的名称(不包括.py)必须是有效的Python名称(即可用作变量名)。
grafanalib
,根据 doc 文档,文件名必须为 xx.dashboard.py
。然而,我想要导入该文件以简化上传步骤。import imp
时,我会得到警告:
这是一个使用imp 模块已被弃用,建议使用 importlib,并计划在 Python 3.12 中删除。有关替代用法,请参阅模块的文档。
importlib
和 pathlib
的简单演示:
foo.bar.py
和 main.py
在同一个文件夹中。# foo.bar.py
num = 42
# main.py
import importlib.machinery
import pathlib
module = importlib.machinery.SourceFileLoader(
"foo_bar",
pathlib.Path(__file__).parent.joinpath("foo.bar.py").resolve().as_posix(),
).load_module()
print(module.num) # 42
为了支持这一点,Python 有一种方法可以将定义放在一个文件中,并在脚本或解释器的交互实例中使用它们。这样的文件被称为模块;
- Alexander Bird