Python3.8跨脚本导入变量报错:无法从getimp.py导入session0
问题原因及解决方案
核心错误原因
session0是getimp.py中main()函数的局部变量,仅在函数运行期间有效,函数执行结束后就会销毁,天然无法被外部模块直接导入- 导入Python模块时,
if __name__ == "__main__"包裹的代码不会执行,也就是说你单独运行getimp.py时触发的main函数调用逻辑,在被导入时根本不会运行,连给session0赋值的流程都没有触发
你猜测的「脚本运行结束变量丢失」是错误的,本质问题是变量的作用域不符合导入要求,且赋值逻辑未在导入场景下触发。
修复方案
第一步:修改getimp.py逻辑
把获取session0的逻辑封装成带返回值的独立函数,同时将变量暴露到模块全局作用域,示例修改如下:
#! /usr/bin/env python3 import os import json import base64 import sqlite3 import shutil from datetime import datetime, timedelta import win32crypt # pip install pypiwin32 from Crypto.Cipher import AES # pip install pycryptodome def get_chrome_datetime(chromedate): """Return a `datetime.datetime` object from a chrome format datetime""" # 原有逻辑保持不变 pass def get_encryption_key(): # 原有解密密钥逻辑保持不变 pass def decrypt_data(encrypted, key): # 原有解密逻辑保持不变 pass # 把原有main函数里的逻辑封装成带返回值的函数 def get_session0(): # 原有连接数据库、查询cookie的逻辑保持不变 cursor.execute(""" SELECT host_key, name, value, creation_utc, last_access_utc, expires_utc, encrypted_value FROM cookies WHERE name like '%user_id%'""") key = get_encryption_key() decrypted_value = None for host_key, name, value, creation_utc, last_access_utc, expires_utc, encrypted_value in cursor.fetchall(): if not value: decrypted_value = decrypt_data(encrypted_value, key) else: decrypted_value = value print(f""" {decrypted_value} ===============================================================""") # 增加兜底判断避免查询不到数据时报错 if not decrypted_value: raise Exception("未查询到匹配的user_id cookie") return decrypted_value # 模块全局暴露session0变量,导入时自动执行获取逻辑 session0 = get_session0() if __name__ == "__main__": get_session0()
第二步:直接运行lookup.py即可
原有lookup.py的代码不需要修改,即可正常导入并打印session0的值。
内容的提问来源于stack exchange,提问作者Packwood
相关产品推荐
相关产品推荐

