`多处理.Process`在windows和linux中导入变量的方式不同

2024-05-23 23:33:22 发布

您现在位置:Python中文网/ 问答频道 /正文

背景

为了了解更多信息,并更好地使用C语言进行跨平台构建,我正在开发一个与makefile等效的编译器和调试器。有点像IDE,但不太像。我不想在这一部分中陷入太多的泥潭,但足以说明我想利用开源项目gdbgui的一部分作为调试器

在我的理想使用中,我将在它自己的gdbgui中启动Process,这样我就可以从主进程中终止它。幸运的是,gdbgui是用python编写的,因此用我自己的自定义实现简单地替换main()应该相对简单

实施

我查看了gdbgui源代码,找到了main()的相关位,这些位允许我访问^{}中的功能部分:

  • appFlask()的一个实例
  • setup_backend显然是用一些配置启动flask服务器的函数

我的意图是做main()正在做的事情,而不需要所有的命令行解析。更具体地说,定制app并运行setup_backend()。为了简洁起见,我删除了一些代码(例如停止进程),但这是功能位:

from multiprocessing import Process

from gdbgui.backend import app as _app
from gdbgui.backend import setup_backend as _setup_backend

def start_stop_gdb():
    _app.config['rr'] = False
    _app.config['gdb_path'] = 'gdb'
    _app.config['show_gdbgui_upgrades'] = False
    _app.config['initial_binary_and_args'] = ['./debug.elf']

    self.process = Process(
        target=_setup_backend,
        kwargs={
            'serve': True,
            'port': 5000,
            'open_browser': True
        }
    )
    self.process.start()

这实际上在linux中非常有效,这是我第一次尝试它的地方。我的目标是拥有一个非常可移植的实现,所以我希望它在windows中也能以同样的方式工作

问题

当我在Windows中运行时,我得到一个KeyError,它表示app没有rr键,这是在上面的代码段中特别指定的

如果我直接运行_setup_backend()而不运行multiprocessing.Process,那么它在Windows和Linux中工作正常,但是我的主线程会冻结,直到程序退出并且主程序无法停止调试过程

需要说明的是,以下代码段在Windows中工作,但会阻止主线程:

def start_stop_gdb():
    _app.config['rr'] = False
    _app.config['gdb_path'] = 'gdb'
    _app.config['show_gdbgui_upgrades'] = False
    _app.config['initial_binary_and_args'] = ['./debug.elf']

    _setup_backend(
        serve=True, port=5000, 'open_browser'=True
    )

简言之,在linux中,app的实例似乎正在根据需要进行更新,但在windows中,正在使用一个单独的app实例

想法


Tags: 实例fromimportconfigbackendfalsetrueapp