我正在清理一个被重构为较小的.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
的一部分吗?
是否可以使用先导入的另一个模块导入的模块?
答案 0 :(得分:7)
它们在以下命名空间中可用:
import alt
print (alt.os.getcwd())
答案 1 :(得分:1)
您仅在os
的子模块级别中导入alt
。 os
只能通过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
中的名称main
。 import os
中的语句alt
将在下一步运行。它将创建sys.modules['os']
和alt.os
引用的模块。如果您要在import os
之后的main
中添加一行import alt
,则不会创建并加载另一个模块对象。相反,名称os
将绑定到sys.modules['os']
指向的同一对象。
main
的以下三个版本都将调用相同的getcwd
函数:
直接导入(推荐):
import alt
import os
print(os.getcwd())
使用alt
中的引用(更难阅读/跟踪):
import alt
print(alt.os.getcwd())
使用sys.modules
(除非您知道自己在做什么,否则不建议用于制作):
import alt # necessary to trigger the actual import
import sys
print(sys.modules['os'].getcwd())
所有导入都会加载一个完整的模块。这甚至适用于from os import getcwd
形式的导入。仍然创建了模块sys.modules['os']
。唯一的区别是导入命名空间只能访问名称getcwd
,而不能访问os
。在您的情况下,如果alt
包含from os import getcwd
而不是import os
,则三种访问方法将更改如下:
print(alt.getcwd())
,因为alt.os
已不复存在。答案 3 :(得分:-1)
你是这样写的
__author__ = 'kerberos'
__date__ = '2017/10/25 20:48 '
import alt
print(alt.os.getcwd())
结果如下:
C:\用户\管理员\桌面\ 11