找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 5317|回复: 3

[求助] pyinstall 打包多进程程序问题

1

主题

3

帖子

3

积分

贫民

积分
3
Crackm5 发表于 2016-10-17 16:43:07 | 显示全部楼层 |阅读模式
请问下大家,有没有遇到使用pyinstall打包多进程的python程序时,子进程关闭不了的情况?
回复

使用道具 举报

1

主题

3

帖子

3

积分

贫民

积分
3
Crackm5  楼主| 发表于 2016-10-17 18:44:08 | 显示全部楼层
# -*- coding: utf-8 -*-

from multiprocessing import Process, freeze_support
import time
import signal
import os


def test():
    while True:
        print "I am running!"
        time.sleep(1)


if __name__ == "__main__":
    freeze_support()
    for i in range(3):
        t_process = Process(target=test, args=())
        t_process.start()
        time.sleep(5)
        os.kill(int(t_process.pid), signal.SIGTERM)
        # t_process.terminate()
        time.sleep(0.1)
        print str(t_process.name) + ':' + str(t_process.is_alive())
回复 支持 反对

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2016-10-17 20:52:58 | 显示全部楼层
python3.4.4. 在原程序的前面添加下面这段代码, 打包成的单个exe可以正常工作

  1. import multiprocessing.popen_spawn_win32
  2. import os
  3. import sys
  4. class _Popen(multiprocessing.popen_spawn_win32.Popen):
  5.     def __init__(self, *args, **kw):
  6.         if hasattr(sys, 'frozen'):
  7.             os.putenv('_MEIPASS2', sys._MEIPASS + os.sep)
  8.         try:
  9.             super(_Popen, self).__init__(*args, **kw)
  10.         finally:
  11.             if hasattr(sys, 'frozen'):
  12.                 if hasattr(os, 'unsetenv'):
  13.                     os.unsetenv('_MEIPASS2')
  14.                 else:
  15.                     os.putenv('_MEIPASS2', '')

  16. class Process(multiprocessing.Process):
  17.     _Popen = _Popen
复制代码


看起来你使用的是python2.x , 大概应该用下面这段代码
  1. import multiprocessing.forking
  2. import multiprocessing.pool
  3. import os
  4. import sys
  5. class _Popen(multiprocessing.forking.Popen):
  6.     def __init__(self, *args, **kw):
  7.         if hasattr(sys, 'frozen'):
  8.             os.putenv('_MEIPASS2', sys._MEIPASS + os.sep)
  9.         try:
  10.             super(_Popen, self).__init__(*args, **kw)
  11.         finally:
  12.             if hasattr(sys, 'frozen'):
  13.                 if hasattr(os, 'unsetenv'):
  14.                     os.unsetenv('_MEIPASS2')
  15.                 else:
  16.                     os.putenv('_MEIPASS2', '')
  17.                     
  18. class Process(multiprocessing.Process):
  19.     _Popen = _Popen


  20. class Pool(multiprocessing.pool):
  21.     Process = Process
复制代码
回复 支持 反对

使用道具 举报

1

主题

3

帖子

3

积分

贫民

积分
3
Crackm5  楼主| 发表于 2016-10-18 09:21:52 | 显示全部楼层
whydo1 发表于 2016-10-17 20:52
python3.4.4. 在原程序的前面添加下面这段代码, 打包成的单个exe可以正常工作

恩,就是这个代码!谢谢了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表