脚本程序打包后,黑框一闪而过,程序不能运行
自己写了一个流程自动化的工作脚本,但打包成exe后, 双击程序-->出现黑框-->几秒后闪过图片上的代码-->黑框迅速消失1. 打包代码:pyinstaller -F F:\CPTT\PerdayWork\PerdayWork.py
2. 程序运行所需要的图片文件也导入到程序同一文件夹下了
3. raw_input()或者os.system(“pause”) 也试过了,不好使
不明白这个ImportError怎么回事?该怎么办?
代码和图片放上来看看,光看这个错误也不知道是什么原因啊 打包前 先运行下程序 是否缺失模块引用 是不是某个import引入的包少了? 源程序的链接是我另一个求助帖:https://fishc.com.cn/forum.php?mod=viewthread&tid=180447&page=1#pid4988050
源程序已经完美解决,能够在pycharm实现了,再次感谢大佬@疾风怪盗
但是目前打包却出现了错误,就连 打包前脱离pycharm,双击.py文件先运行下程序都不行,也是出现黑框,ImportError
今天百度了下,大概可能是:
1. 不能用 from xx import xx这种导入方式
2. Process 多进程打包还涉及一个什么GIL锁
总之还没搞懂{:10_277:}
打包代码(我对代码做了点小小的改动):
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() 疾风怪盗 发表于 2020-9-22 00:16
代码和图片放上来看看,光看这个错误也不知道是什么原因啊
{:10_257:}大佬,就是那个暂停程序的代码,我在5楼补充说明了 2223069513 发表于 2020-9-22 21:55
大佬,就是那个暂停程序的代码,我在5楼补充说明了
打包确实报错了,网上也找不到答案,貌似就是pynput这个模块的问题,直接import pynput也不行
不知道了。。。。。。
打包过程也蛮顺利的,没报错,不知道为什么运行就报错了。。。。。。。
但是你说双击.py文件先运行下程序都不行,也是出现黑框,ImportError
我这边右键直接用python运行py文件,没问题啊 pynput的库写的有问题 咋办呢?
我等级比较低 发不了图片。。。
先看看报错是怎么回事
去看报错py文件,在里面添加 print(modules)和 print(e) 结果是 modules是 ['win32'],e也就是报错原因是 No module named 'pynput.keyword._win32'
怎么办? 修改import的方式
from pynput.keyboard._win32 import Listener
import pynput.mouse._win32
# 第二个模块也要导 否则依然报错 {:10_277:}python这点就很好导的库很容易能去查看源码并修改 疾风怪盗 发表于 2020-9-22 22:28
打包确实报错了,网上也找不到答案,貌似就是pynput这个模块的问题,直接import pynput也不行
不知道了 ...
{:10_277:}我是双击.py文件也打不开...
更奇怪的是我这段代码在pycharm里面可以完美运行,但是复制到python自带的IDLE就报错
mrcrisis 发表于 2020-9-23 20:52
pynput的库写的有问题 咋办呢?
我等级比较低 发不了图片。。。
先看看报错是怎么回事
{:10_245:} 这个语句加到源代码中,我还是不能双击.py文件打开
但是打包成exe后,可以打开,但是只有一个小黑框,程序也不运行(没有打印数字)
甚至按“d”都没反应,更严重的,大概5秒后电脑宕机了,这个程序未响应,只能重启电脑 2223069513 发表于 2020-9-23 23:24
我是双击.py文件也打不开...
更奇怪的是我这段代码在pycharm里面可以完美运行,但是复制到p ...
{:10_284:}无能为力,不清楚怎么回事了 https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=180648&pid=4996993
你这基础没学好啊。。。你的pycharm和python自带的两个环境一般是不一样的 或者说两者调用的解释器(python的exe)不是一个
所以pycharm里面有pynput的模块,但是python自带的没有。。 你得去cmd里面pip一下pynput才行 2223069513 发表于 2020-9-23 23:29
这个语句加到源代码中,我还是不能双击.py文件打开
但是打包成exe后,可以打开,但是只有 ...
你这基础没学好啊。。。
你的pycharm和python自带的两个环境一般是不一样的 或者说两者调用的解释器(python的exe)不是一个
所以pycharm里面有pynput的模块,但是python自带的没有。。 你得去cmd里面pip一下pynput才行 2223069513 发表于 2020-9-23 23:29
这个语句加到源代码中,我还是不能双击.py文件打开
但是打包成exe后,可以打开,但是只有 ...
看你似乎不是很熟悉python我补充一点
在你的python环境的 Lib/site-packages/pynput/_util/__init__.py 里加 print(modules)和print(e)这个是看报错信息的 可以不加 因为已经找到错误了
在你自己写的py文件第一行
原来的from pynput.keyboard import Listener改成 from pynput.keyboard._win32 import Listener
import pynput.mouse._win32
这样就不会报ImportError
至于你说的py文件不能双击打开 看我上面 mrcrisis 发表于 2020-9-24 10:28
看你似乎不是很熟悉python我补充一点
在你的python环境的 Lib/site-packages/pynput/_util/__init__.py...
哦哦,双击.py文件打不开的问题解决了,现在能直接双击文件运行了
{:10_298:}
但是代码按照你的改了之后,打包后运行exe任然不能正常运行,我换了同学的电脑也打包了一次也不行,就是出现了黑框,然后半天不动,没有打印数字.
纯小白,大佬费心了{:10_245:} 今天我也遇到这个问题,搜索了一下解决了,办法是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
页:
[1]