pyinstaller 打包多进程脚本时,不运行相关函数解决方法

    2019年8月19日 19:26   129 人阅读  0 条评论   编辑

使用pyinstaller打包多进程python脚本程序时,打包成功后,脚本一直在死循环中,但是就是没有运行指定的函数,且进程数不断增加,电脑的cpu和内存很快到100%。

背景:

  • window10

  • python 3.6

  • pyinstaller 3.4

经过网上的多番搜索查阅发现是因为程序使用了多进程模式,而在windows上Pyinstaller打包多进程程序需要添加特殊指令。

这里是官方github给出的解释:

https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessing

解决方法:

根据pyinstaller版本不同方法不一样。

第一种,pyinstaller版本大于3.3,添加multiprocessing.freeze_support()

if __name__=='__main__':
	# 在此处添加
	multiprocessing.freeze_support()
	# 这里是你的代码

第二种,pyinstaller版本小于3.3,需要添加一个模块

import os
import sys

# Module multiprocessing is organized differently in Python 3.4+
try:
    # Python 3.4+
    if sys.platform.startswith('win'):
        import multiprocessing.popen_spawn_win32 as forking
    else:
        import multiprocessing.popen_fork as forking
except ImportError:
    import multiprocessing.forking as forking

if sys.platform.startswith('win'):
    # First define a modified version of Popen.
    class _Popen(forking.Popen):
        def __init__(self, *args, **kw):
            if hasattr(sys, 'frozen'):
                # We have to set original _MEIPASS2 value from sys._MEIPASS
                # to get --onefile mode working.
                os.putenv('_MEIPASS2', sys._MEIPASS)
            try:
                super(_Popen, self).__init__(*args, **kw)
            finally:
                if hasattr(sys, 'frozen'):
                    # On some platforms (e.g. AIX) 'os.unsetenv()' is not
                    # available. In those cases we cannot delete the variable
                    # but only set it to the empty string. The bootloader
                    # can handle this case.
                    if hasattr(os, 'unsetenv'):
                        os.unsetenv('_MEIPASS2')
                    else:
                        os.putenv('_MEIPASS2', '')

    # Second override 'Popen' class with our modified version.
    forking.Popen = _Popen

把上述内容保存为multiprocess.py ,然后在你的程序中引入该模块即可:

from multiprocess import *

参考文章:

https://blog.csdn.net/zyc121561/article/details/82941056

Pyinstaller基本用法:https://blog.csdn.net/zyc121561/article/details/79563662

Pyinstaller隐式导入出错解决:https://blog.csdn.net/zyc121561/article/details/79562935


本文地址:http://www.chenxm.cc/article/891.html
版权声明: 本文为原创文章,版权归  csdn  所有,欢迎分享本文,转载请保留出处!
PREVIOUS: Pyinstaller 打包selenium 会弹出chromedriver黑框的解决方法
NEXT: python之re提取字符串中括号内的内容
 相关文章  关键词:

 发表评论

还没有留言,还不快点抢沙发?