小编ws_*_*421的帖子

当进程被终止时,Python 中的文件对象是如何清理的?

当进程终止时,Python 中的文件对象会发生什么?SIGTERMPython 以、SIGKILLSIGHUP(等)或异常终止有关系吗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)

python io terminate

6
推荐指数
1
解决办法
1201
查看次数

如何更改多处理模块使用的序列化方法?

如何更改 Pythonmultiprocessing库使用的序列化方法?特别是,默认序列化方法使用pickle具有该版本 Python 的默认 pickle 协议版本的库。默认的 pickle 协议在 Python 2.7 中是版本 2,在 Python 3.6 中是版本 3。如何在 Python 3.6 中将协议版本设置为 2,以便我可以使用库中的一些类(如ClientListener)在multiprocessingPython 2.7 运行的服务器处理和 Python 3.6 运行的客户端进程之间进行通信?

(旁注:作为测试,我修改了第 206 行multiprocessing/connection.py,添加protocol=2dump()调用中以强制协议版本为 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 serialization pickle python-multiprocessing

6
推荐指数
1
解决办法
4033
查看次数

如何支持 Python 包中的替代依赖项?

我用 Python 编写了一个与 Qt 框架配合使用的实用程序库。我的代码是纯Python,并且与PyQt5和PySide2兼容。我的主模块可以从命令行单独运行python -m,也可以导入到另一个项目中。有没有一种干净的方法来指定项目在其轮子发行版中需要 PyQt5 或 PySide2?

这是我在研究中发现的内容,但我想知道是否有比这些选项更好的方法来打包项目:

我可以在项目的源代码分发中添加逻辑setup.py来检查 PyQt5 和 PySide2。然而,轮子是分发 Python 项目的推荐方式,据我所知,这种安装时逻辑使用轮子是不可能的。或者,我无法指定 PySide2 或 PyQt5 作为依赖项,并在安装说明中建议将其中之一与我的项目一起安装。

python packaging python-wheel

3
推荐指数
1
解决办法
538
查看次数