我正在使用 django,我有一个名为 models.admin.py 的文件,我想在 models.py 中执行以下想法:
from "models.admin" import *
但是,我收到双引号的语法错误。但如果我只是这样做
from models.admin import *
然后我得到“ImportError:没有名为 admin 的模块”
有没有办法从名称中有句点的python文件导入?
我正在使用 django,我有一个名为 models.admin.py 的文件,我想在 models.py 中执行以下想法:
from "models.admin" import *
但是,我收到双引号的语法错误。但如果我只是这样做
from models.admin import *
然后我得到“ImportError:没有名为 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 模块导入一个具有不寻常文件名的模块(例如,一个在 '.py' 之前包含一个 '.' 的文件名):
>>> 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 ab”将加载 a/b.py。
该文件称为models/admin.py
. (来源)
也就是说,它应该admin.py
在一个名为models
.
然后你可以导入 using from models.admin import *
,假设它在你的 Python 路径中。
不,如果 python 文件的名称包含句点(或问号、感叹号等),则不能将其作为模块导入。python 模块的名称(不包括.py)必须是有效的python 名称(即可以用作变量名)。
像下面
假设 dir 结构是这样的:
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()
看看这个要点