9

一年前我已经问过这个确切的问题。我的应用程序使用 Python 的多处理模块,该模块在从命令行运行时可以正常工作,但是当我使用 Pyinstaller 将其打包为可执行文件时,多个进程会作为原始实例的新实例生成,而不是运行它们应该运行的函数。上次给我的建议以及我在其他地方看到的建议是multiprocessing.freeze_support(在我的块开始时调用 ),if __name__ == "__main__":我一直在这样做,但由于某种原因我突然又遇到了这个问题。还有什么可能导致这种情况?

更新:我已经确认 freeze_support() 行的存在根本不会影响这个问题。评论它或取消评论它会给出完全相同的行为:主窗口的副本被打开并坐在那里什么都不做。这是在我的主要 Python 模块的最末端调用它的块:

if __name__ == '__main__':
    freeze_support()

    # (A bunch of commented-out lines)
    main()
4

3 回答 3

6

我是一个白痴。(好吧,也许不是,但这完全是我的错)多处理通过使用两个附加参数运行它来向进程发出它是子进程的信号:标志--multiprocessing-fork和来自父进程的管道的数字句柄。multiprocessing.freeze_support检查此标志的存在以确定是运行为子进程指定的函数还是正常程序。无论如何,我解析命令行参数的方法改变了sys.argv,它摆脱了标志并导致子进程像新的父进程一样工作。

所以,这个故事的寓意是,永不改变sys.argv我切换到使用optparse,它抱怨标志的存在,所以我不得不向它传递一个过滤的参数列表。一旦我这样做了,问题就消失了。

于 2012-08-06T14:42:25.027 回答
2

setup.py可能导致此问题的样式程序的其他问题:

如果你使用入口点来启动你的程序,你可能需要把multiprocessing.freeze_support().main()

例如Pyinstaller_setuptoolsmain()直接调用,跳过if __name__ == '__main__':块中的所有语句。

于 2019-12-23T22:24:03.380 回答
2

我遇到了同样的问题,但我已经解决了在代码中放置 if 子句以避免每个 kivy 代码在新进程中运行的问题。例如:

if __name__ == '__main__': # to avoid new window with a new process
    multiprocessing.freeze_support() # support multiprocessing in pyinstaller
    from kivy.lang.builder import Builder
    from kivy.clock import Clock
    from kivy.uix.popup import Popup
    from kivy.uix.textinput import TextInput
    from kivy.uix.scatterlayout import ScatterLayout
    from kivy.graphics.transformation import Matrix
    from kivy.uix.scatter import Scatter
    from kivy.uix.screenmanager import ScreenManager, Screen
    from kivy.properties import BooleanProperty, ListProperty, BoundedNumericProperty, StringProperty, NumericProperty
    from kivy.uix.boxlayout import BoxLayout
    from kivy.app import App
    from kivy.uix.behaviors import ButtonBehavior
    from kivy.uix.image import Image
    from kivy.core.window import Window

除此之外,我所有使用 kivy 的类都需要放在同一个 if 子句中,以避免主程序中的错误。

我的结论是 kivy、多处理和 pyinstaller 的一些交互使新窗口弹出。如果直接从 python 运行代码,则不会显示问题。就我而言,我已经在使用一个 if 子句来导入 kivy.core.window,并且直接从 python 运行代码效果很好,但在 pyinstaller 之后却没有,即使使用 freeze_support。

我希望它可以帮助某人。

于 2018-10-19T11:05:26.963 回答