当前位置: 首页 > 面试题库 >

python多次导入

时修贤
2023-03-14
问题内容

我想这是一个普遍的问题,如果不能在正确的位置发布,抱歉。

比如说,我有一个aimport的函数os。如果我要多次从另一个文件调用此函数,我是否假设导入也将多次进行?有没有办法仅在模块不存在时才导入?

基本上,我有一个类,它调用从各个文件导入的多个函数,而不是导入整个文件,我认为仅导入该函数会更容易,但是现在我想知道从长远来看是否会令自己头痛进口过多。


问题答案:

正如描述的蟒蛇文档中,当蟒蛇看到它下面的一些事情的import语句:

  • 检查一些全局表(如果模块已经导入)
    • 如果未导入模块,python将其导入,创建模块对象,并将新创建的模块对象放入全局表
    • 如果模块是导入的python只是获取模块对象
  • 当python有模块对象时,它将其绑定到您选择的名称
    • 如果它是import foo模块的名称foo将是foo
    • 如果它是import foo as bar模块的名称foo将是bar
    • 如果是from foo import bar as bazpython ,则bar在模块中查找函数(或其他函数)foo并将该函数绑定到namebaz

因此,每个模块仅导入一次。

为了更好地理解导入机制,我建议创建一个玩具示例。

档案module.py

print("import is in progress")

def foo():
    pass

档案main.py

def foo():
    print("before importing module")
    import module
    module.foo()
    print("after importing module")

if __name__ == '__main__':
    foo()
    foo()

将以上文件放入同一目录。当module.py正在导入它打印import is in progress。启动时main.py,它将尝试module多次导入,但输出将是:

before importing module
import is in progress
after importing module
before importing module
after importing module

因此导入实际上只发生一次。您可以调整此玩具示例以检查您感兴趣的案例。



 类似资料:
  • 问题内容: 在Ruby中,我没有重复很多次“ require”(在Python中为“ import”)一词,而是 因此,它将遍历每个“ lib”和“ require”(导入)的集合。现在,我正在编写Python脚本,我想做类似的事情。是否有办法为所有这些人写“导入”。 简单的“引导”将类似于以下代码。无论如何,由于Python不会导入命名为字符串的库,因此它不起作用。 提前致谢 问题答案: 对于已

  • 问题内容: 我一直想知道这一点:是否可以保证多次导入模块都是安全的?当然,如果模块执行操作系统之类的操作,例如写入文件之类的东西,则可能不会,但是对于大多数简单模块而言,简单地随意执行导入是否安全?是否有规范模块全局状态的约定? 问题答案: 是的,无论它是什么模块,您都可以在一个Python程序中进行任意多次。在第一个之后的每个后续访问访问缓存的模块,而不是重新评估它。

  • 我看过这些网站: python相对导入示例代码不起作用 第十亿次相对进口 https://peps.python.org/pep-0328/ Python包:相对导入 Python中的相对导入 并且加载了更多我没有展示的内容,但是它们(答案/代码)由于某种原因无法相对导入其他Python“模块”。而且,我总是有这样一个永远重复出现的错误:< code>ImportError:在没有已知父包的情况下

  • 问题内容: 存在的问题是:在Windows 7、32位Python 2.7.3中,如何解决此“尝试以非软件包方式进行相对导入”消息?我在上构建了该软件包的精确副本: 导入是从控制台完成的。 我确实在相应的模块中创建了名为垃圾邮件和鸡蛋的函数。自然,它不起作用。答案显然是在我列出的第4个网址中,但对我来说都是校友。我访问的其中一个URL上有此响应: 相对导入使用模块的名称属性来确定该模块在包层次结构

  • 问题内容: 据我了解,python模块永远不会导入两次,即该模块中的代码仅在首次导入时才执行。随后的import语句只需将模块添加到导入范围即可。 我有一个名为“ TiledConvC3D.py”的模块,但似乎已多次导入。我使用pdb在该模块的代码顶部打印堆栈。 这是从第一次执行模块开始的堆栈跟踪的结尾: 它将继续执行多次。但是,第二次调用的完整堆栈跟踪不会显示对的任何调用,因此不应执行这些执行: