Python 在 Windows 关闭时将集保存到文件?

2023-12-02

如果 Windows 即将关闭/重新启动/注销/睡眠,我不想丢失我的设置,是否可以在关闭之前保存它?或者是否有其他方法可以保存信息而不必担心 Windows 关闭时信息会丢失? JSON、CSV、数据库?任何事物?

s = {1,2,3,4}

with open("s.pick","wb") as f: # pickle it to file when PC about to shutdown to save information
    pickle.dump(s,f)

如果 Windows 即将关闭/重新启动/注销/睡眠,我不想丢失我的设置,是否可以在关闭之前保存它?

是的,如果您构建了带有消息循环的应用程序,您可以接收WM_QUERYENDSESSION信息。如果您想要一个 GUI,大多数 GUI 库可能会以自己的方式包装它。如果您不需要 GUI,最简单的解决方案可能是使用PyWin32。在文档的某个地方有一个关于创建隐藏窗口和编写简单消息循环的教程。只需在主线程上执行此操作,然后在后台线程上完成真正的工作,并在出现异常时向后台线程发出信号WM_QUERYENDSESSION消息进来了。

或者,更简单地,正如 Evgeny Prokurat 建议的那样,只需使用SetConsoleCtrlHandler(再次通过 PyWin32)。这还可以捕获 ^C、^BREAK 和用户关闭控制台,以及注销和关闭消息WM_QUERYENDSESSION捕获。更重要的是,它不需要消息循环,因此如果您没有任何其他需要,它会简单得多。


或者是否有其他方法可以保存信息而不必担心 Windows 关闭时信息会丢失? JSON、CSV、数据库?任何事物?

文件格式不会神奇地解决任何问题。然而,数据库有两个优点。

首先,你可以通过尽可能多地写作来减少问题。但对于大多数文件格式,这意味着尽可能频繁地重写整个文件,这将非常慢。解决方案是流式传输到更简单的“日志”文件,较少地将其打包到真实文件中,并在每次启动时寻找剩余的日志。您可以手动执行此操作,但数据库通常会自动为您执行此操作。

其次,如果你在写入过程中被杀死,你最终会得到一半的文件。您可以通过原子写入技巧来解决这个问题 - 写入一个临时文件,然后用临时文件替换旧文件 - 但这在 Windows 上很难正确执行(尤其是使用 Python 2.x)(请参阅正确进行原子写入),同样,数据库通常会为您做这件事。


执行此操作的“正确”方法是创建一个新的窗口类,其中包含一个 msgproc,该 msgproc 会分派到您的处理程序WM_QUERYENDSESSION。正如 MFC 使这比原始 Win32 API 代码更容易一样,win32ui(它包装了 MFC)使这比win32api/win32gui(它包装了原始 Win32 API)。您可以找到很多示例(例如,快速搜索“pywin32 msgproc example”会出现类似的示例this,并搜索“python win32ui”和类似的术语也同样有效)。

但是,在这种情况下,您没有一个想要像普通窗口一样运行的窗口,因此直接进入低级别并编写一个快速且肮脏的消息循环可能会更容易。不幸的是,找到示例代码要困难得多——您基本上必须在本机 API 中搜索 C 示例代码(例如创建消息循环(MSDN),然后弄清楚如何将其转换为 Pythonpywin32文档。不太理想,特别是如果你不懂 C,但不是that难的。下面是一个帮助您入门的示例:

def msgloop():
    while True:
        msg = win32gui.GetMessage(None, 0, 0)
        if msg and msg.message == win32con.WM_QUERYENDSESSION:
            handle_shutdown()
        win32api.TranslateMessage(msg)
        win32api.DispatchMessage(msg)
        if msg and msg.message == win32con.WM_QUIT:
            return msg.wparam

worker = threading.Thread(real_program)
worker.start()
exitcode = msgloop()
worker.join()
sys.exit(exitcode)

我还没有展示“如何创建最小的隐藏窗口”部分,或者如何指示工作人员停止,例如threading.Condition,因为这些零件有更多(并且更容易找到)好的样本;这是最难找到的部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 在 Windows 关闭时将集保存到文件? 的相关文章

  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • 为 Anaconda Python 安装 psycopg2

    我有 Anaconda Python 3 4 但是每当我运行旧代码时 我都会通过输入 source activate python2 切换到 Anaconda Python 2 7 我的问题是我为 Anaconda Python 3 4 安
  • 使用 matplotlib 绘制时间序列数据并仅在年初显示年份

    rcParams date autoformatter month b n Y 我正在使用 matpltolib 来绘制时间序列 如果我按上述方式设置 rcParams 则生成的图会在每个刻度处标记月份名称和年份 我怎样才能将其设置为仅在每
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • Spark KMeans 无法处理大数据吗?

    KMeans 有几个参数training http spark apache org docs latest api python pyspark mllib html highlight kmeans pyspark mllib clus
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • 无法在 Python 3 中导入 cProfile

    我试图将 cProfile 模块导入 Python 3 3 0 但出现以下错误 Traceback most recent call last File
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • Scrapy:如何使用元在方法之间传递项目

    我是 scrapy 和 python 的新手 我试图将 parse quotes 中的项目 item author 传递给下一个解析方法 parse bio 我尝试了 request meta 和 response meta 方法 如 sc
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐