当进程终止时,Python 中的文件对象会发生什么?SIGTERMPython 以、SIGKILL、SIGHUP(等)或异常终止有关系吗KeyboardInterrupt?
我有一些日志记录脚本,可以不断获取数据并将其写入文件。我不关心做任何额外的清理,但我只想确保当Python突然终止时日志文件不会损坏(例如,我可以让它在后台运行,然后关闭计算机)。我制作了以下测试脚本来尝试看看会发生什么:
termtest.sh:
for i in $(seq 1 10); do
python termtest.py $i & export pypid=$!
sleep 0.3
echo $pypid
kill -SIGTERM $pypid
done
Run Code Online (Sandbox Code Playgroud)
termtest.py:
import csv
import os
import signal
import sys
end_loop = False
def handle_interrupt(*args):
global end_loop
end_loop = True
signal.signal(signal.SIGINT, handle_interrupt)
with open('test' + str(sys.argv[-1]) + '.txt', 'w') as csvfile:
writer = csv.writer(csvfile)
for idx in range(int(1e7)):
writer.writerow((idx, 'a' * 60000))
csvfile.flush()
os.fsync(csvfile.fileno())
if …Run Code Online (Sandbox Code Playgroud) 如何更改 Pythonmultiprocessing库使用的序列化方法?特别是,默认序列化方法使用pickle具有该版本 Python 的默认 pickle 协议版本的库。默认的 pickle 协议在 Python 2.7 中是版本 2,在 Python 3.6 中是版本 3。如何在 Python 3.6 中将协议版本设置为 2,以便我可以使用库中的一些类(如Client和Listener)在multiprocessingPython 2.7 运行的服务器处理和 Python 3.6 运行的客户端进程之间进行通信?
(旁注:作为测试,我修改了第 206 行multiprocessing/connection.py,添加protocol=2到dump()调用中以强制协议版本为 2,并且我的客户端/服务器进程在我有限的测试中工作,服务器由 2.7 运行,客户端由 3.6 运行)。
在 Python 3.6 中,合并了一个补丁来设置序列化程序,但是该补丁没有记录,我还没有弄清楚如何使用它。这是我尝试使用它的方式(我也将其发布到我链接到的 Python 票证上):
pickle2reducer.py:
from multiprocessing.reduction import ForkingPickler, AbstractReducer
class ForkingPickler2(ForkingPickler):
def __init__(self, *args):
if len(args) > 1:
args[1] = 2
else:
args.append(2)
super().__init__(*args)
@classmethod …Run Code Online (Sandbox Code Playgroud) 我用 Python 编写了一个与 Qt 框架配合使用的实用程序库。我的代码是纯Python,并且与PyQt5和PySide2兼容。我的主模块可以从命令行单独运行python -m,也可以导入到另一个项目中。有没有一种干净的方法来指定项目在其轮子发行版中需要 PyQt5 或 PySide2?
这是我在研究中发现的内容,但我想知道是否有比这些选项更好的方法来打包项目:
我可以在项目的源代码分发中添加逻辑setup.py来检查 PyQt5 和 PySide2。然而,轮子是分发 Python 项目的推荐方式,据我所知,这种安装时逻辑使用轮子是不可能的。或者,我无法指定 PySide2 或 PyQt5 作为依赖项,并在安装说明中建议将其中之一与我的项目一起安装。