1 python shutdown power-management python-2.7
如果 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)
Run Code Online (Sandbox Code Playgroud)
\n\n\n如果 Windows 即将关闭/重新启动/注销/睡眠,我不想丢失我的设置,是否可以在关闭之前保存它?
\n
是的,如果您构建了带有消息循环的应用程序,则可以接收消息WM_QUERYENDSESSION。如果您想要一个 GUI,大多数 GUI 库可能会以自己的方式包装它。如果您不需要 GUI,最简单的解决方案可能是使用PyWin32。在文档的某个地方有一个关于创建隐藏窗口和编写简单消息循环的教程。只需在主线程上执行此操作,然后在后台线程上完成真正的工作,并在出现异常时向后台线程发出信号WM_QUERYENDSESSION收到消息时向后台线程发出信号。
或者,更简单地,正如 Evgeny Prokurat 建议的那样,只需使用SetConsoleCtrlHandler(再次通过 PyWin32)。这还可以捕获 ^C、^BREAK 和用户关闭控制台,以及WM_QUERYENDSESSION捕获的注销和关闭消息。更重要的是,它不需要消息循环,因此如果您没有任何其他需要,它会简单得多。
\n\n\n或者是否有其他方法可以保存信息而不必担心 Windows 关闭时信息会丢失?JSON、CSV、数据库?任何事物?
\n
文件格式不会神奇地解决任何问题。然而,数据库有两个优点。
\n\n首先,你可以通过尽可能多地写作来减少问题。但对于大多数文件格式,这意味着尽可能频繁地重写整个文件,这将非常慢。解决方案是流式传输到更简单的“日志”文件,较少地将其打包到真实文件中,并在每次启动时寻找剩余的日志。您可以手动执行此操作,但数据库通常会自动为您执行此操作。
\n\n其次,如果你在写入过程中被杀死,你最终会得到一半的文件。您可以通过原子写入技巧\xe2\x80\x94写入一个临时文件,然后用临时\xe2\x80\x94替换旧文件来解决这个问题,但这在Windows上很难得到正确的结果(尤其是Python 2.x)(请参阅正确进行原子写入),并且数据库通常会为您完成此操作。
\n\n执行此操作的“正确”方法是使用 msgproc 创建一个新的窗口类,该 msgproc 会分派到 上的处理程序WM_QUERYENDSESSION。正如 MFC 使这比原始 Win32 API 代码更容易一样, (它包装了 MFC)比/ (它包装了原始 Win32 API)win32ui更容易。您可以找到很多相关示例(例如,快速搜索“pywin32 msgproc example”会出现这样的示例,并且搜索“python win32ui”和类似术语也同样有效)。win32apiwin32gui
然而,在这种情况下,您没有一个想要像普通窗口一样运行的窗口,因此直接进入低层并编写一个快速且肮脏的消息循环可能会更容易。不幸的是,要找到 xe2x80x94 的示例代码要困难得多,您基本上必须在本机 API 中搜索 C 示例代码(例如在 MSDN 上创建消息循环),然后弄清楚如何将其转换为 Python文档pywin32。不太理想,特别是如果您不了解 C,但也不是那么难。这是一个帮助您入门的示例:
def msgloop():\n while True:\n msg = win32gui.GetMessage(None, 0, 0)\n if msg and msg.message == win32con.WM_QUERYENDSESSION:\n handle_shutdown()\n win32api.TranslateMessage(msg)\n win32api.DispatchMessage(msg)\n if msg and msg.message == win32con.WM_QUIT:\n return msg.wparam\n\nworker = threading.Thread(real_program)\nworker.start()\nexitcode = msgloop()\nworker.join()\nsys.exit(exitcode)\nRun Code Online (Sandbox Code Playgroud)\n\n我还没有展示“如何创建最小隐藏窗口”部分,或者如何指示工作人员停止,例如 a threading.Condition,因为对于这些有更多(并且更容易找到)好的样本部分; 这是最难找到的部分。
| 归档时间: |
|
| 查看次数: |
2803 次 |
| 最近记录: |