当前位置: 首页 > 面试题库 >

Python-从可执行文件运行时,Multiprocessing.processes成为主进程的副本

阮轶
2023-03-14
问题内容

我刚刚在程序中发现一个奇怪的错误,该错误与使用Python的多处理模块有关。从计算机上的源代码运行程序时,一切正常。但是我已经使用pyinstaller将其构建为可执行文件,并且由于某些原因,当我运行通过代码构建的可执行文件时,多处理行为会发生巨大变化。具体来说,当我尝试运行代码的多处理部分,而不是执行应有的操作时,似乎弹出了程序主窗口的一个副本,每个进程一个。更糟糕的是,如果手动关闭它们,它们会重新打开,大概是因为它们是multiprocessing.pool的一部分。没有错误消息被打印,并且一旦创建所有窗口,就坐在那里什么也不做。是什么原因引起的?


问题答案:

在Windows上,multiprocessing尝试fork()通过启动可执行文件的新实例来模拟Unix系统调用,并在multiprocessing.forking.main()其中执行其子进程例程()。使用标准的Python解释器(python.exe),multiprocessing可以传递-c参数以运行自定义代码。但是,对于自定义可执行文件,这是不可能的,因为该可执行文件很可能不支持与相同的命令行选项python.exe

freeze_support()函数通过显式执行子进程例程来避免此问题,并通过调用终止解释器sys.exit()。如果您忘记调用freeze_support(),则新进程将不知道它是一个子进程并运行主应用程序逻辑。在您的情况下,这将弹出另一个主GUI窗口。

由于从新创建的进程中启动另一个子进程将导致无限递归,因此请multiprocessing尝试通过检查sys.frozen属性来防止这种情况,并引发未调用RuntimeErrorif的freeze_support()情况。在您的情况下,似乎需要用户交互来生成进程,因此没有无限递归,也没有RuntimeError

按照约定,sys.frozen仅为py2exe或PyInstaller创建的自动生成的可执行文件设置。理解这个逻辑,并设置它是非常重要的sys.frozen,以True当一个人想要在应该支持windows下多处理自定义可执行文件中嵌入了Python。



 类似资料:
  • 我试图写一个Java程序,它得到一个可执行文件运行在Linux下。此可执行文件接收两个参数,并使用这两个给定参数执行nmap-sp操作。 我将此文件称为file.exe,其内容如下: 我得到以下异常和错误日志: 线程“main”java.io.ioException中的异常:无法运行程序“file.exe”:error=2,在java.lang.runtime.exec(runtime.java:

  • 问题内容: 一年多以前,有人问这个问题:在python中执行用于在SQL Management Studio中运行的.sql文件 。 我正在用python编写脚本,该脚本连接到SQL Server,并根据SQL命令在大(数GB)的.sql文件中创建和填充数据库。 看起来SQLCMD需要下载并安装SQL Server Express。还有其他方法可以从python执行.sql文件,而不需要每个使用我

  • 我已经能够使用pyInstaller从Python 3.4代码成功地生成Windows可执行文件。 但是,每次运行可执行文件(控制台应用程序)时,它都会在代码启动前输出以下内容: 我假设这是pyInstaller引导加载程序过程,如下所述。我想知道是否有一种方法可以抑制这个输出,而不抑制我自己的Python代码生成的输出? 附加信息: 生成单个可执行文件(使用选项) 运行在Windows 7 En

  • 终端中使用lldb运行可执行文件 进入lldb环境, 在终端内输入lldb回车 lldb 使用file命令, 将可执行文件包装成一个target (lldb) file test Current executable set to '/Users/shenyj/Documents/CodeForTest/staticOCLib/test' (x86_64). 运行可执行文件, 在刚刚的l

  • 例如 nginx start nginx stop 但是可执行文件 并没有与进程关联 我想实现类似热更新的功能

  • 问题内容: 我以为我听说py2exe可以做到这一点,但我从来没有想过。有人成功做到了吗?我可以看到您的setup.py文件以及使用的哪些命令行选项吗? 基本上,我在考虑给它一个可执行文件,该文件执行诸如将自身解压缩到/ temp并运行的操作。 问题答案: 将创建一个没有依赖关系的.exe文件;使用该选项。它通过将所有需要的共享库打包到可执行文件中,然后在运行之前解压缩它们来完成此操作,正如你所描述

  • 我正在尝试并行运行两个exe程序。我想启动它们,等待它们完成后再继续。以下是一个例子: 第一个进程睡眠5秒,第二个进程睡眠10秒。我希望看到进程启动的两条消息和“等待任务”消息。10秒后,请参见“过程完成”。但是,我立即看到“Procs complete”。 任务管理器显示正在运行的进程,同时显示“进程完成”。 那么,我如何从一个程序中启动两个独立的可执行程序,并行运行它们,然后等待它们完成,然后

  • 我正在尝试将java文件导出为可运行文件。使用Eclipse的jar文件。我正在做的程序是: 文件 我的问题是,当我在Eclipse中运行该文件时,任何导入的图片(例如GUI应用程序的徽标)都会显示出来,但它不会显示在导出的页面中。jar文件。 即: http://gyazo.com/4092e8756f4054ce00429d50c33c22af-月食中http://gyazo.com/7309