基本上有一个名为8puzzle.py
的文件,我想将文件导入另一个文件(在同一文件夹中,我不能在提供文件时更改文件名)。无论如何在Python中这样做?我尝试了常用方式from 8puzzle import *
,它给了我一个错误。
错误是:
>>> import 8puzzle
File "<input>", line 1
import 8puzzle
^
SyntaxError: invalid syntax
>>>
答案 0 :(得分:73)
你可以做到
puzzle = __import__('8puzzle')
非常有趣的问题。我记得不要用数字命名任何东西。
如果您想import *
- 您应该check out this question and answer。
答案 1 :(得分:23)
以上答案是正确的,但就目前而言,推荐的方法是使用import_module
功能:
现在不推荐<强>
importlib.import_module(name, package=None)
强>
导入模块。名字 参数指定以绝对或相对术语导入的模块 (例如pkg.mod
或..mod
)。如果名称是以相对方式指定的 条件,那么package参数必须设置为的名称 用作解析包名称的锚点的包 (例如import_module('..mod', 'pkg.subpkg')
将导入pkg.mod
)。import_module()函数充当简化包装器
importlib.__import__()
。这意味着函数的所有语义都是 源自importlib.__import__()
。最重要的区别 这两个函数之间是import_module()
返回的 指定的包或模块(例如pkg.mod
),而__import__()
返回 顶级包或模块(例如pkg
)。如果您要动态导入自创建以来创建的模块 解释器开始执行(例如,创建了一个Python源文件),你 可能需要调用
invalidate_caches()
才能使用新模块 进口系统注意到了。
<强>
importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)
强>
内置__import__()
函数的实现。注意编程模块的导入应使用
import_module()
而不是此函数。
答案 2 :(得分:2)
请勿在导入中使用.py
扩展名。
from 8puzzle import *
是否有效?
对于它的价值,from x import *
不是首选的Python模式,因为它会将该模块的命名空间渗透到当前上下文中。
通常,尝试从该模块导入您特别想要的内容。可以导入其他模块中的任何全局。
例如,如果你有8puzzle.foo
你可以从8puzzle import
虽然我的.py
消息是正确的,但这还不够。
另一张海报的__import__('8puzzle')
建议是正确的。但是,我强烈建议避免使用此模式。
首先,它保留了一个内部的私有Python方法。 您基本上打破了导入模块意味着什么的基本假设。只需将文件重命名为其他内容,例如puzzle8
,就可以解决此问题。
这会让经验丰富的Python程序员感到沮丧,他们希望知道你的导入是什么,并期望代码(尝试)符合PEP8。
答案 3 :(得分:0)
文件目录结构如下:
daily
-- 20210504
permutations.py
__init__.py
__init__.py
您可以通过 permutations
或 __import__
导入 importlib.import_module
模块。
官方文档推荐使用importlib.import_module
。
import(name, globals=None, locals=None, fromlist=(), level=0) -> 模块
导入模块。因为这个函数是供 Python 解释器使用而不是一般用途,所以最好
useimportlib.import_module()
以编程方式导入模块。
有什么区别?
如果使用 __import__
实现。
例如:
res = __import__('daily.20210504.permutations')
所以,如果要获取permutations
模块,需要提供fromlist参数,其写法如下。
res = __import__('daily.20210504.permutations', fromlist=('daily.20210504'))
如果我使用 importlib.import_module
会怎样?
res = importlib.import_module('daily.20210504.permutations')
这允许您直接获取 permutations
模块。