如果我只导入函数而不是整个 sys 库,则“sys.dont_write_bytecode”不起作用

`sys.dont_write_bytecode` not working if I just import the function instead of the whole sys library

提问人:ersignee_ 提问时间:9/7/2023 更新时间:9/7/2023 访问量:61

问:

我正在尝试删除用于导入模块的__pycache__文件夹,如果我:

from sys import dont_write_bytecode 
dont_write_bytecode = True 

import folder.modulename as modulename 

文件夹仍然会被创建,但如果我导入所有库,如下所示:

import sys 
sys.dont_write_bytecode = True 

import folder.modulename as modulename 

未创建的文件夹。

有人可以解释为什么会发生这种情况,以及是否可以避免导入整个 sys 库?

python 系统

评论

1赞 jasonharper 9/7/2023
之后,您现在有一个在您自己的命名空间中命名的变量,其值(大概)为 。更改该变量的值对变量本身以外的任何内容都没有可想象的影响;它当然不会改变模块中的值,它仍然是 .from sys import dont_write_bytecodedont_write_bytecodeFalsesysFalse

答:

1赞 Tim Roberts 9/7/2023 #1

是的。当您编写 时,它会在命名空间中创建一个新名称,并将其绑定到与 中的对象相同的对象。当你写 时,你正在将一个不同的布尔对象绑定到你的名字,取代你的旧绑定。它对属于 的变量完全没有影响。from sys import dont_write_bytecodesysdont_write_bytecode = Truedont_write_bytecodesys

然而,为了纠正另一个误解,使用 并不比 更有效。from sys import xxximport sys

您编写的导入完全等同于:

import sys
dont_write_bytecode = sys.dont_write_bytecode
del sys

构造始终必须导入整个模块。from sys import

评论

0赞 ersignee_ 9/7/2023
谢谢你的回答。我正在导入我需要的东西,这样我就可以节省一些空间,因为对于我使用它的程序,我的空间有限,所以我试图尽可能多地节省。我注意到您使用了关键字来删除模块。这是否有助于节省一些空间并在我使用后删除 sys 模块?del
0赞 user2357112 9/7/2023
@ersignee_:不,那只是取消了名称。你不会节省你试图节省的空间。(事实上,默认情况下必须加载 Python 解释器本身才能工作,因此即使您完全删除导入,您仍然不会节省该空间。该模块已经加载,因此导入所做的只是绑定一个名称。sys
0赞 Tim Roberts 9/8/2023
从字面上看,与这三行完全相同。from sys import dont_write_bytecode