Python中decryptor函数未满足条件却自动执行的问题求助
函数无需触发自动执行的问题分析
你的decryptor函数会在程序启动时自动执行,完全不受主程序if条件的控制,问题根源出在Decryptor.py文件的代码里。
主程序代码
from Decryptor import decryptor # 注意:Python导入模块时不需要加.py后缀 userInput = int(input("请选择模式?(1-4) ")) if userInput == 3: decryptor()
注:无论用户输入是否为3,
decryptor函数都会在程序运行时立刻执行。
Decryptor.py代码(问题版本)
# 来自Decryptor.py的代码 import os from cryptography.fernet import Fernet def decryptor(): fileName = input("请输入要解密的文件名(区分大小写):") with open(fileName + ".key", "rb") as file: key = file.read() key = Fernet(key) with open(fileName + ".json", "rb") as encryptedFile: passwordFile = encryptedFile.read() decrypt = key.decrypt(passwordFile) with open(fileName + ".json", "wb") as decryptedFile: decryptedFile.write(decrypt) print("文件已解密完成。") decryptor() # 问题核心:模块被导入时,这行顶级代码会自动执行
注:Python模块被导入时,模块内的所有顶级代码(包括函数定义外的代码)都会被执行。这里最后一行直接调用
decryptor(),导致只要主程序导入Decryptor模块,函数就会立刻运行,和主程序的if条件无关。
解决方案
修改Decryptor.py,把直接调用函数的代码改成仅在模块自身运行时才执行的形式:
# 修改后的Decryptor.py import os from cryptography.fernet import Fernet def decryptor(): fileName = input("请输入要解密的文件名(区分大小写):") with open(fileName + ".key", "rb") as file: key = file.read() key = Fernet(key) with open(fileName + ".json", "rb") as encryptedFile: passwordFile = encryptedFile.read() decrypt = key.decrypt(passwordFile) with open(fileName + ".json", "wb") as decryptedFile: decryptedFile.write(decrypt) print("文件已解密完成。") # 仅当直接运行Decryptor.py时,才执行decryptor函数 if __name__ == "__main__": decryptor()
修改后,主程序导入Decryptor模块时不会自动执行decryptor函数,只有当用户输入为3,触发if条件里的decryptor()调用时,函数才会执行。
内容的提问来源于stack exchange,提问作者user19597157
相关产品推荐
相关产品推荐

