鱼C论坛

 找回密码
 立即注册
查看: 4782|回复: 16

脚本程序打包后,黑框一闪而过,程序不能运行

[复制链接]
发表于 2020-9-22 00:13:42 | 显示全部楼层 |阅读模式
10鱼币
自己写了一个流程自动化的工作脚本,但打包成exe后, 双击程序-->出现黑框-->几秒后闪过图片上的代码-->黑框迅速消失

1. 打包代码:pyinstaller -F F:\CPTT\PerdayWork\PerdayWork.py
2. 程序运行所需要的图片文件也导入到程序同一文件夹下了
3. raw_input()或者os.system(“pause”) 也试过了,不好使

error

error


不明白这个ImportError怎么回事?该怎么办?



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-22 00:16:57 | 显示全部楼层
代码和图片放上来看看,光看这个错误也不知道是什么原因啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-22 08:12:21 | 显示全部楼层
打包前 先运行下程序 是否缺失模块引用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-22 19:20:08 From FishC Mobile | 显示全部楼层
是不是某个import引入的包少了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-22 21:45:49 | 显示全部楼层
源程序的链接是我另一个求助帖:https://fishc.com.cn/forum.php?m ... p;page=1#pid4988050
源程序已经完美解决,能够在pycharm实现了,再次感谢大佬@疾风怪盗
但是目前打包却出现了错误,就连 打包前脱离pycharm,双击.py文件先运行下程序都不行,也是出现黑框,ImportError

今天百度了下,大概可能是:
1. 不能用 from xx import xx  这种导入方式
2. Process 多进程打包还涉及一个什么GIL锁
总之还没搞懂


打包代码(我对代码做了点小小的改动):
from pynput.keyboard import Listener
import time
from tkinter import *
import os
from multiprocessing import Process
import psutil


# 设置进程1,实现目标:按键监听,当按下“d”键时,进程2能挂起(暂停运行),并弹窗提示"继续程序"和"终止程序"按钮。
# 当按下"继续程序"按钮时,进程2能接下去运行,当按下"终止程序"时,进程2能结束运行。
def work1(pid, mainpid):
    # 按键监听,当按下“d"键时弹窗
    def on_press(key):
        all_key = []
        all_key.append(str(key))
        if "'d'" in all_key:
            pause = psutil.Process(pid)  # 传入子进程的pid
            pause.suspend()  # 暂停子进程
            #print(f'{pid}子进程已暂停。。。。')

    def on_release(key):
        all_key = []
        all_key.append(str(key))
        if "'d'" in all_key:
            def zzcx():
                pipause = psutil.Process(mainpid)  # 传入主进程的pid
                pipause.kill()
                #print(f'{mainpid}主进程已结束。。。。')
                tanchuan_zt.destroy()
                os._exit(0)

            def jxcx():
                pause = psutil.Process(pid)  # 传入子进程的pid
                pause.resume()  # 暂停子进程
                #print(f'{pid}子进程已继续。。。。')
                tanchuan_zt.destroy()

            # 设置弹窗
            tanchuan_zt = Tk()
            tanchuan_zt.wm_attributes('-topmost', 1)  # 弹窗置顶
            tanchuan_zt.title("终止/暂停程序")
            wb_zt = Label(tanchuan_zt, text="您按下了”D(d)“键,此为暂停程序键,\n请问是否继续", compound=CENTER,
                          font=("楷体", 20), fg="black")
            wb_zt.pack(pady=20)
            xx1_button = Button(tanchuan_zt, text="终止程序", command=zzcx)
            xx1_button.pack(side="left", padx=120)
            xx2_button = Button(tanchuan_zt, text="继续程序", command=jxcx)
            xx2_button.pack(side="right", padx=120)

            # 弹窗位置大小设置
            width = 700
            height = 200
            screenwidth = tanchuan_zt.winfo_screenwidth()
            screenheight = tanchuan_zt.winfo_screenheight()
            alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
            tanchuan_zt.geometry(alignstr)
            tanchuan_zt.mainloop()

            all_key.clear()  # 对列表进行清空

        # if key == Key.esc:  # 停止监听
        #     return Falseurn False

    def start_listen():  # 设置监听
        with Listener(on_press=on_press, on_release=on_release) as listener:
            listener.join()

    start_listen()  # 启动监听


# 设置进程2,一个普通的打印数字程序
def work2(mainpid):
    for i in range(1, 10):
        print(i)
        time.sleep(1)
    pipause2 = psutil.Process(mainpid)  # 传入主进程的pid
    pipause2.kill()
    os._exit(0)

if __name__ == '__main__':
    mainpid = os.getpid()  # 获取主进程pid
    p2 = Process(target=work2,args=(mainpid,))
    p2.start()
    pid = p2.pid  # 获取子进程pid
    p1 = Process(target=work1, args=(pid, mainpid))
    p1.start()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-22 21:55:00 | 显示全部楼层
疾风怪盗 发表于 2020-9-22 00:16
代码和图片放上来看看,光看这个错误也不知道是什么原因啊

大佬,就是那个暂停程序的代码,我在5楼补充说明了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-22 22:28:51 | 显示全部楼层
2223069513 发表于 2020-9-22 21:55
大佬,就是那个暂停程序的代码,我在5楼补充说明了

打包确实报错了,网上也找不到答案,貌似就是pynput这个模块的问题,直接import pynput也不行
不知道了。。。。。。
打包过程也蛮顺利的,没报错,不知道为什么运行就报错了。。。。。。。

但是你说双击.py文件先运行下程序都不行,也是出现黑框,ImportError
我这边右键直接用python运行py文件,没问题啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-23 20:52:24 | 显示全部楼层
pynput的库写的有问题 咋办呢?
我等级比较低 发不了图片。。。
先看看报错是怎么回事
去看报错py文件,在里面添加 print(modules)和 print(e) 结果是 modules是 ['win32'],e也就是报错原因是 No module named 'pynput.keyword._win32'
怎么办? 修改import的方式
  1. from pynput.keyboard._win32 import Listener
  2. import pynput.mouse._win32
  3. # 第二个模块也要导 否则依然报错
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-23 20:56:44 | 显示全部楼层
python这点就很好  导的库很容易能去查看源码并修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-23 23:24:25 | 显示全部楼层
疾风怪盗 发表于 2020-9-22 22:28
打包确实报错了,网上也找不到答案,貌似就是pynput这个模块的问题,直接import pynput也不行
不知道了 ...

我是双击.py文件也打不开...

更奇怪的是我这段代码在pycharm里面可以完美运行,但是复制到python自带的IDLE就报错

1212.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-23 23:29:45 | 显示全部楼层
mrcrisis 发表于 2020-9-23 20:52
pynput的库写的有问题 咋办呢?
我等级比较低 发不了图片。。。
先看看报错是怎么回事

这个语句加到源代码中,我还是不能双击.py文件打开

但是打包成exe后,可以打开,但是只有一个小黑框,程序也不运行(没有打印数字)

甚至按“d”都没反应,更严重的,大概5秒后电脑宕机了,这个程序未响应,只能重启电脑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-23 23:37:46 | 显示全部楼层
2223069513 发表于 2020-9-23 23:24
我是双击.py文件也打不开...

更奇怪的是我这段代码在pycharm里面可以完美运行,但是复制到p ...

无能为力,不清楚怎么回事了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-24 09:30:12 | 显示全部楼层
https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=180648&pid=4996993

你这基础没学好啊。。。你的pycharm和python自带的两个环境一般是不一样的 或者说两者调用的解释器(python的exe)不是一个
所以pycharm里面有pynput的模块,但是python自带的没有。。 你得去cmd里面pip一下pynput才行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-24 09:31:09 | 显示全部楼层
2223069513 发表于 2020-9-23 23:29
这个语句加到源代码中,我还是不能双击.py文件打开

但是打包成exe后,可以打开,但是只有 ...

你这基础没学好啊。。。
你的pycharm和python自带的两个环境一般是不一样的 或者说两者调用的解释器(python的exe)不是一个
所以pycharm里面有pynput的模块,但是python自带的没有。。 你得去cmd里面pip一下pynput才行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-24 10:28:07 | 显示全部楼层
2223069513 发表于 2020-9-23 23:29
这个语句加到源代码中,我还是不能双击.py文件打开

但是打包成exe后,可以打开,但是只有 ...

看你似乎不是很熟悉python我补充一点
在你的python环境的 Lib/site-packages/pynput/_util/__init__.py 里加 print(modules)和print(e)这个是看报错信息的 可以不加 因为已经找到错误了
在你自己写的py文件第一行
原来的
  1. from pynput.keyboard import Listener
复制代码
改成
  1. from pynput.keyboard._win32 import Listener
  2. import pynput.mouse._win32
复制代码

这样就不会报ImportError
至于你说的py文件不能双击打开 看我上面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-24 23:52:56 | 显示全部楼层
mrcrisis 发表于 2020-9-24 10:28
看你似乎不是很熟悉python我补充一点
在你的python环境的 Lib/site-packages/pynput/_util/__init__.py  ...

哦哦,双击.py文件打不开的问题解决了,现在能直接双击文件运行了



但是代码按照你的改了之后,打包后运行exe任然不能正常运行,我换了同学的电脑也打包了一次也不行,就是出现了黑框,然后半天不动,没有打印数字.

纯小白,大佬费心了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-12 00:05:50 | 显示全部楼层
今天我也遇到这个问题,搜索了一下解决了,办法是pynput降级至1.6.8老版本。

原文如下:
Please fall back to 1.6.8 version of pynput. pip install pynput==1.6.8
原网页:
Getting error when using pynput with pyinstaller
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-9 15:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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