Windows 中的 Python 日志记录与多处理

2023-12-12

我有一个相当大的 Python 项目,目前在 Linux 上运行,但我正在尝试扩展到 Windows。我已将代码简化为一个完整的示例,可以运行它来说明我的问题:我有两个类,Parent 和 Child。首先初始化父级,创建一个记录器,并生成一个子级来执行工作:

import logging
import logging.config
import multiprocessing

class Parent( object ):
    def __init__(self, logconfig):
        logging.config.dictConfig(logconfig)
        self.logger = logging.getLogger(__name__)
    
    def spawnChild(self):
        self.logger.info('One')
        c = Child(self.logger)
        c.start()

class Child(multiprocessing.Process):
    def __init__(self, logger):
        multiprocessing.Process.__init__(self)
        self.logger = logger

    def run(self):
        self.logger.info('Two')

if __name__ == '__main__':
    p = Parent({
            'version':1, 
            "handlers": {
                "console": {
                    "class": "logging.StreamHandler",
                    "stream": "ext://sys.stdout"
                },
            },
            "root": {
                "level": "DEBUG",
                "handlers": [
                    "console",
                    ]
                }
            }
        )
    p.spawnChild()

在 Linux(特别是 ubuntu 12.04)上,我得到以下(预期)输出:

user@ubuntu:~$ python test.py 
One
Two

但是,在 Windows(特别是 Windows 7)上,它会失败并出现酸洗错误:

C:\>python test.py
<snip>
pickle.PicklingError: Can't pickle <type 'thread.lock'>: it's not found as thread.lock

问题归结为 Windows 缺乏真正的分叉,因此在线程之间发送对象时必须进行 pickle。但是,记录器不能被腌制。我尝试过使用__getstate__ and __setstate__以避免酸洗,并在 Child 中按名称引用:

def __getstate__(self):
    d = self.__dict__.copy()
    if 'logger' in d.keys():
        d['logger'] = d['logger'].name
    return d

def __setstate__(self, d):
    if 'logger' in d.keys():
        d['logger'] = logging.getLogger(d['logger'])
    self.__dict__.update(d)

这在 Linux 中和以前一样有效,现在 Windows 不会因以下原因而失败PicklingError。但是,我的输出仅来自父级:

C:\>python test.py
One

C:\>

尽管没有消息抱怨,但孩子似乎无法使用记录器No logger could be found for handler '__main__'或任何其他错误消息。我环顾四周,发现有一些方法可以完全重组我登录程序的方式,但这显然是最后的手段。我希望我只是错过了一些明显的东西,希望群众的智慧能够向我指出这一点。


在多数情况下,Logger对象不可 picklable,因为它们使用 unpicklabletheading.Lock and/or file内部对象。您尝试的解决方法确实避免了酸洗logger,但它最终创造了一个完全不同的Logger在子进程中,它恰好与Logger在父级中;的影响logging.config您拨打的电话已丢失。要获得您想要的行为,您需要在子进程中重新创建记录器and记起logging.config.dictConfig:

class Parent( object ):
    def __init__(self, logconfig):
        self.logconfig = logconfig
        logging.config.dictConfig(logconfig)
        self.logger = logging.getLogger(__name__)

    def spawnChild(self):
        self.logger.info('One')
        c = Child(self.logconfig)
        c.start()

class Child(multiprocessing.Process):
    def __init__(self, logconfig):
        multiprocessing.Process.__init__(self)
        self.logconfig = logconfig

    def run(self):
        # Recreate the logger in the child
        logging.config.dictConfig(self.logconfig)
        self.logger = logging.getLogger(__name__)

        self.logger.info('Two')

或者,如果您想继续使用__getstate__/__setstate__:

class Parent( object ):
    def __init__(self, logconfig):
        logging.config.dictConfig(logconfig)
        self.logger = logging.getLogger(__name__)
        self.logconfig = logconfig

    def spawnChild(self):
        self.logger.info('One')
        c = Child(self.logger, self.logconfig)
        c.start()

class Child(multiprocessing.Process):
    def __init__(self, logger, logconfig):
        multiprocessing.Process.__init__(self)
        self.logger = logger
        self.logconfig = logconfig

    def run(self):
        self.logger.info('Two')

    def __getstate__(self):
        d = self.__dict__.copy()
        if 'logger' in d:
            d['logger'] = d['logger'].name
        return d

    def __setstate__(self, d):
        if 'logger' in d:
            logging.config.dictConfig(d['logconfig'])
            d['logger'] = logging.getLogger(d['logger'])
        self.__dict__.update(d)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 中的 Python 日志记录与多处理 的相关文章

  • 为什么我不能导入 geopandas?

    我唯一的代码行是 import geopandas 它给了我错误 OSError Could not find libspatialindex c library file 以前有人遇到过这个吗 我的脚本运行得很好 直到出现此错误 请注意
  • 如何在以管理员身份运行模式下部署应用程序?

    如何部署应用程序 使其需要管理员权限 而无需最终用户手动执行此操作 我使用 Delphi 2009 来构建该应用程序 您可以使用以下命令通知 Windows 您的应用程序需要以管理员身份运行requestedExecutionLevel应用
  • 如何在 Ubuntu 上安装 Python 模块

    我刚刚用Python写了一个函数 然后 我想将其做成模块并安装在我的 Ubuntu 11 04 上 这就是我所做的 创建 setup py 和 function py 文件 使用 Python2 7 setup py sdist 构建分发文
  • Python 中的六边形自组织映射

    我在寻找六边形 自组织映射 http en wikipedia org wiki Self organizing map在Python上 准备好模块 如果存在的话 绘制六边形单元格的方法 将六边形单元作为数组或其他方式使用的算法 About
  • 如何更改充当按钮的范围的文本

    我正在为自定义 Web 应用程序编写自动化测试 我遇到了无法更改跨度文本的问题 我尝试过使用 driver execute script 但没有运气 如果我更好地了解 javascript 这确实会有帮助 据我所知 您无法单击跨度 并且列表
  • 使用正则表达式解析 Snort 警报文件

    我正在尝试使用 Python 中的正则表达式从 snort 警报文件中解析出源 目标 IP 和端口 和时间戳 示例如下 03 09 14 10 43 323717 1 2008015 9 ET MALWARE User Agent Win9
  • 唯一的图像哈希值即使 EXIF 信息更新也不会改变

    我正在寻找一种方法来为 python 和 php 中的图像创建唯一的哈希值 我考虑过对原始文件使用 md5 和 因为它们可以快速生成 但是当我更新 EXIF 信息 有时时区关闭 时 它会更改总和 并且哈希也会更改 有没有其他方法可以为这些文
  • 行为:如何从另一个文件导入步骤?

    我刚刚开始使用behave http pythonhosted org behave 一个Pythonic BDD框架 使用小黄瓜语法 http docs behat org guides 1 gherkin html 行为需要一个特征 例
  • 在wxpython中使用wx.TextCtrl并在按钮单击后显示数据的简单示例 - wx新手

    我正在学习 python 并尝试使用 wxpython 进行 UI 开发 也没有 UI exp 我已经能够创建一个带有面板 按钮和文本输入框的框架 我希望能够在文本框中输入文本 并让程序在单击按钮后对输入框中的文本执行操作 我可以获得一些关
  • 从命令行启用/禁用 Windows 10 中的设备 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个特定的硬件 我想在每次 Windows 重新启动时禁用并重新启用它 我创建了一个批处理脚本 该脚本应该执行此操作 然后运行我的程序
  • 在 Mac 上安装 Pygame 到 Enthought 构建中

    关于在 Mac 上安装 Pygame 有许多未解答的问题 但我将在这里提出我的具体问题并希望得到答案 我在 Mac 上安装 Pygame 时遇到了难以置信的困难 我使用 Enthought 版本 EPD 7 3 2 32 位 它是我的默认框
  • 使用循环将对象添加到列表(python)

    我正在尝试使用 while 循环将对象添加到列表中 基本上这就是我想做的 class x pass choice raw input pick what you want to do while choice 0 if choice 1 E
  • 使用 python 将文本发送到带有逗号分隔符的列

    如何使用分隔符 在 Excel 中将一列分成两列 并使用 python 命名标题 这是我的代码 import openpyxl w openpyxl load workbook DDdata xlsx active w active a a
  • FastText - 由于 C++ 扩展未能分配内存,无法加载 model.bin

    我正在尝试使用 FastText Python APIhttps pypi python org pypi fasttext https pypi python org pypi fasttext虽然 据我所知 此 API 无法加载较新的
  • 在pycharm中调试python代码

    这个问题类似于this https stackoverflow com questions 10240018 how to use pycharm to debug python script一 我正在尝试调试pyethapp https
  • WindowsError:[错误 5] 访问被拒绝

    我一直在尝试终止一个进程 但我的所有选项都给出了 Windows 访问被拒绝错误 我通过以下方式打开进程 一个python脚本 test subprocess Popen sys executable testsc py 我想杀死那个进程
  • 使用 Doc2vec 后如何解释 Clusters 结果?

    我正在使用 doc2vec 将关注者的前 100 条推文转换为矢量表示形式 例如 v1 v100 之后 我使用向量表示来进行 K 均值聚类 model Doc2Vec documents t size 100 alpha 035 windo
  • Plotly:如何避免巨大的 html 文件大小

    我有一个 3D 装箱模型 它使用绘图来绘制输出图 我注意到 绘制了 600 个项目 生成 html 文件需要很长时间 文件大小为 89M 这太疯狂了 我怀疑可能存在一些巨大的重复 或者是由单个项目的 add trace 方法引起的 阴谋 为
  • 具有指定置信区间的 Seaborn 条形图

    我想在 Seaborn 条形图上绘制置信区间 但我已经计算出置信区间 如何让 Seaborn 绘制我的置信区间而不是尝试自行计算它们 例如 假设我有以下 pandas DataFrame x pd DataFrame Group 1 0 5
  • 使用“pythonw”(而不是“python”)运行应用程序时找不到模块

    我尝试了这个最小的例子 from flask import Flask app Flask name app route def hello world return Hello World if name main app run deb

随机推荐

  • 本地文件系统上的独立 HBase 出现 Zookeeper 错误?

    大家好 我正在尝试遵循HBase快速入门并在本地文件系统上启动 HBase 不使用 HDFS 但是 当我使用 hbase shell 启动 shell 并输入 status 时 我收到 Zookeeper 错误 hbase main 001
  • 如何避免缩进的嵌套承诺?

    我听说承诺在代码中应该是线性的 而不是回调 回调地狱 尽管我仍然有一个类似于回调地狱的场景 并希望 Promise 能够兑现其承诺 并具有与此问题代码等效的线性语法 给出的承诺p q w 考虑这段代码 p then gt q then gt
  • 在 Windows 上安装 Theano - DLL 加载失败

    我正在尝试在 Windows 8 上安装 Theano 已关注these steps 我尝试使用以下方法进行测试 import numpy as np import time import theano print blas ldflags
  • 合并一个 data.frame 中的行

    这是一个非常相似的问题将两行合并到一个数据框中但我有字符串变量 只想折叠一些具有相同国家 地区名称的行 我改编了MWER data lt data frame code c 345 346 name Yemen v1 c text1 v2
  • 当我查看包含 YoutubePlayerController 的页面时,下一页停止工作

    Problem 加载 YoutubePlayerIFrame 后下一页的小部件将不起作用 例如 假设您有 A 和 B 有状态小部件 首先加载 A 其中YoutubePlayerIFrame叫做 您可以按 A 中的按钮 但是当您移动到 B 时
  • 如何匹配目标中的双干,如 %/% 或其他方式?

    我需要建立具有如下名称的目标 v1 thread4 foo v1 thread8 foo v1 thread16 foo v2 thread4 foo v2 thread8 foo v2 thread16 foo 我想匹配thread an
  • ReadStreamAsDT - Filehelpers 和 C# - 如何使用 filehelpers 动态读取 CSV?

    我正在尝试通过 FileHelpers 动态读取 CSV 并将 CSV 数据作为数据表使用 我的 CSV 文件不会相同 它们将具有不同的列标题和不同数量的列 我正在使用 ReadStreamAsDT 方法 但似乎仍然需要一个结构化类来初始化
  • 找不到有关 Python 的 read() 方法的任何信息 (python 2.7)

    我正在尝试通过 Zed Shaw 的 以困难的方式学习 Python 来学习 Python 但我却陷入了看似非常微不足道的事情 我无法找到有关 read 方法的任何信息 他在书中是这样说的 运行 pydoc 文件并向下滚动 直到看到 rea
  • 如何清空WebView的缓存?

    我有一个必须加载图像的 Webview 当我上传此图像时 我每次都会看到与以前相同的图像 并且我必须重新启动我的应用程序才能看到新图像 我认为是缓存问题 我该如何解决这个问题 一种快速简单的方法是在加载时将当前时间戳附加到 url 中 因此
  • 这个thread.abort()正常且安全吗?

    我创建了一个自定义自动完成控件 当用户按下某个键时 它会在另一个线程上查询数据库服务器 使用远程处理 当用户输入速度非常快时 程序必须取消先前执行的请求 线程 我之前首先将其实现为 AsyncCallback 但我发现它很麻烦 需要遵循太多
  • 在 Swift 中异步改变集合的惯用方法

    在 Swift 中异步改变字典 其他集合的惯用正确方法是什么 写代码时经常会出现以下几种情况 func loadData key String dict inout String String Load some data Use Disp
  • 将 SPATIAL 数据从 Oracle 迁移到 Postgresql

    我正在尽力将空间数据库从 Oracle 迁移到 Postgresql 但失败得很惨 正如您从我之前的问题中看到的那样 我尝试了许多不同的途径 但没有一个有效 有人可以告诉我一种相对轻松的方法吗 因为我现在对此一无所知 我尝试过使用 Swis
  • 从子 shell 设置父 shell 的变量

    如何从子 shell 中在父 shell 中设置变量 a 3 a 4 echo a 子 shell 的全部意义在于它doesn t影响通话会话 在 bash 中 子 shell 是一个子进程 其他 shell 有所不同 但即使如此 子 sh
  • 在 MVC 框架下,其他开发人员期望哪种目录结构?

    一般来说 MVC 框架的结构如下所示 models views controllers utils 然而 在 Web 应用程序套件中 我决定将所有模型 视图和控制器聚集在一起可能不是最好的清晰方式 除非我将系统视为一个应用程序而不是应用程序
  • 将 Pandas 多索引变成列

    我有一个具有 2 个索引级别的数据框 value Trial measurement 1 0 13 1 3 2 4 2 0 NaN 1 12 3 0 34 我想把它变成这样 Trial measurement value 1 0 13 1
  • 我可以根据 Objective-C 中的键对 NSDictionary 进行排序吗?

    我可以排序吗NSDictionary基于密钥 您可以对键进行排序 然后创建一个NSMutableArray通过迭代它们 NSArray sortedKeys dict allKeys sortedArrayUsingSelector sel
  • 在所有文件的源路径之间选择

    当我在 Visual Studio 中编译项目时 我会自动运行混淆器 混淆后的 dll 文件以相同的文件名保存在子文件夹中 文件夹结构 FileA Secure subfolder FileA dll FileA dll 问题 我能否确定
  • 如何在 ASP.NET Web 窗体中单击打开另一个选项卡而不刷新当前页面?

    我希望能够单击一个按钮 单击该按钮即可打开另一个选项卡 就我而言 这是使用两个完成的ASP Net控制装置 一asp literal with
  • 将 fread 与 std::vector 一起使用时出错

    第一次执行成功 没有任何错误 但是创建时Data bin当我使用时出现一些错误fread 抱歉 我不知道如何提问 所以请查看该程序 我评论了错误声明 include
  • Windows 中的 Python 日志记录与多处理

    我有一个相当大的 Python 项目 目前在 Linux 上运行 但我正在尝试扩展到 Windows 我已将代码简化为一个完整的示例 可以运行它来说明我的问题 我有两个类 Parent 和 Child 首先初始化父级 创建一个记录器 并生成