使用从另一个导入导入的模块

时间:2017-10-25 12:44:47

标签: python python-3.x import

我正在清理一个被重构为较小的.py文件的项目。我注意到很多模块在各种文件中一次又一次地导入。某些语句位于导入另一个语句的文件中,该文件具有导入文件使用的相同import语句。例如:

main.py

import alt
print (os.getcwd())

alt.py

import os

print(os.getcwd())会引发NameError: name 'os' is not defined。在alt.py中执行import语句时,os不应该成为sys.modules的一部分吗?

是否可以使用先导入的另一个模块导入的模块?

4 个答案:

答案 0 :(得分:7)

它们在以下命名空间中可用:

import alt
print (alt.os.getcwd())

答案 1 :(得分:1)

您仅在os的子模块级别中导入altos只能通过alt.os访问才能提供。解决这个问题的方法是从alt导入所有from alt import *,但这不是你应该做的...

作为一般经验法则,您应该在当前处理的模块的顶层重新导入直接调用的模块。 因此在main.py:

 import os

一切都很好

答案 2 :(得分:0)

要回答您的直接问题,可以但不建议。

Imports调整创建它们的命名空间。这意味着alt有一个属性os,可以在main中访问

print(alt.os.getcwd())

然而,这不是推荐的方法,因为它使您不太清楚使用的是哪个实际的os模块。您应该import os直接main。这将创建一个单独的模块对象,所以不要担心重复模块会使内存混乱。

第一次在运行时遇到导入时,它会被添加到字典sys.modules中,并由模块的完全限定名称键入。在进行任何实际工作之前,未来的import语句将在sys.modules中查找现有参考。

在您的情况下,import alt将创建sys.modules['alt']引用的模块以及alt中的名称mainimport os中的语句alt将在下一步运行。它将创建sys.modules['os']alt.os引用的模块。如果您要在import os之后的main中添加一行import alt,则不会创建并加载另一个模块对象。相反,名称os将绑定到sys.modules['os']指向的同一对象。

main的以下三个版本都将调用相同的getcwd函数:

  1. 直接导入(推荐):

    import alt
    import os
    print(os.getcwd())
    
  2. 使用alt中的引用(更难阅读/跟踪):

    import alt
    print(alt.os.getcwd())
    
  3. 使用sys.modules(除非您知道自己在做什么,否则不建议用于制作):

    import alt  # necessary to trigger the actual import
    import sys
    print(sys.modules['os'].getcwd())
    
  4. 所有导入都会加载一个完整的模块。这甚至适用于from os import getcwd形式的导入。仍然创建了模块sys.modules['os']。唯一的区别是导入命名空间只能访问名称getcwd,而不能访问os。在您的情况下,如果alt包含from os import getcwd而不是import os,则三种访问方法将更改如下:

    1. 不变。
    2. print(alt.getcwd()),因为alt.os已不复存在。
    3. 不变。

答案 3 :(得分:-1)

你是这样写的

__author__ = 'kerberos'
__date__ = '2017/10/25 20:48 '
import alt
print(alt.os.getcwd())

结果如下:

C:\用户\管理员\桌面\ 11