深恶痛绝网上代码抄来抄去,查看既浪费时间又耗费精力。请尊重编程总结的实战经验及成果,本人均为付费,若您赞赏就打赏观阅,若实在需要解决问题,可联系827365498@qq.com谢谢

摘要

最近更新时间:2020.08.20
本文类型:实际经验类(非知识讲解)
python编写程序完成后,为了方便跨平台使用,会将程序转为exe可执行文件。但是封装后执行时,会弹出cmd黑框,在一定程度上影响使用。弹出cmd黑框分为两种:1.py文件运行产生的cmd黑框。2。编程时调用的函数或者命令产生的cmd黑框。一般第一种黑框比较好屏蔽,而第二种黑框就算使用pyinstaller的-w指令后依旧存在。
现总结python封装后在不同情况下关闭cmd黑框的解决方法。本文封装使用pyinstaller库进行。提示:以下是本篇文章正文内容,下面案例可供参考


文章目录

  • 摘要
  • 一、安装pyinstaller库
  • 二、通过更改py后缀名或者打包命令的方式
  • 1、显示py文件后缀名
  • 2、将py后缀更改为pyw
  • 3、可直接修改打包命令
  • 三、更改程序的方式
  • 1、使用subprocess库中call函数
  • 2、使用subprocess库中的Popen函数
  • 四、 构建EXE打包器,一键生成exe
  • 总结



一、安装pyinstaller库

相比较其他封装库,pyinstaller库优势比较明显。生成的exe文件,可以不依赖任何dll文件运行,便于移植。安装步骤如下:

(1)点击win10的开始菜单,直接输入cmd后右键管理员方式运行
(2)若安装python时勾选了添加路径的选项,即可直接输入命令
pip install pyinstaller
(若没有添加,建议卸载python后,重新安装并勾选添加路径。慎重选择该建议,因为需要重新安装之前的下载的库)
(3)在网络连通下等待完成,若提示timeout,则可尝试下面命令切换下载源,重新安装:pip install pyinstaller -i https://pypi.douban.com/simple

二、通过更改py后缀名或者打包命令的方式

可通过将py后缀名更改为pyw的方式,关闭封装exe后出现的cmd,这种方法可屏蔽py文件运行产生的cmd黑框,一般网上较为常见。

1、显示py文件后缀名

(1)python文件的后缀名为.py,可以通过文件夹选项-查看-文件扩展名,显示文件后缀名,然后更改自己的py文件后缀名为pyw。
(2)后缀名更改前封装库指令: pyinstaller -F 测试.py
(3)后缀名更改后封装库指令: pyinstaller -F 测试.pyw
(4)其中"测试"为自己的文件名
(5)再次封装exe,等待完成后可发现cmd黑框消失。若仍存在cmd黑框,则检查程序中是否调用了产生cmd框的函数或者命令。具体请看第三章。

python Popen 隐藏DOS python 隐藏cmd窗口_封装

2、将py后缀更改为pyw

python Popen 隐藏DOS python 隐藏cmd窗口_python_02


python Popen 隐藏DOS python 隐藏cmd窗口_cmd_03

3、可直接修改打包命令

(2)更改前打包指令: pyinstaller -F 测试.py
(3)更改后打包指令: pyinstaller -F 测试.py -w (其中F为大写,w为小写)

三、更改程序的方式

一般在程序中使用了os.system()函数调用其他外部exe,如cmd,ping,exe文件等,或者外部exe制作时带有cmd黑框,无论在打包时在命令中是否加入了-w,还是将文件后缀名改为.pyw,依旧会出现cmd黑框。现总结其他两种调用方式,代替os.system()函数。

1、使用subprocess库中call函数

import subprocess
 subprocess.call("调用的exe名字", creationflags=0x08000000)

其中creationflags=0x08000000即为屏蔽命令。这种方式一般可用于直接调用外部exe文件,而当需要调用cmd或者ping等本身就是黑色框执行的命令时稍有不便,则可尝试第二种方法。

2、使用subprocess库中的Popen函数

举一个简单列子,若需要在10s内ping200个IP地址,若一个一个去ping则需要大量时间。所以可以采用建线程的方式来实现同时ping200个IP地址。那么问题来了,建立了200个线程,那电脑屏幕上岂不是要同时出现200个黑色命令框。对于电脑性能强悍,或者不在乎出现较多黑色命令框的大神请轻轻路过。本人电脑(i5-3210M,16G内存),同时运行时鼠标移动都是瞬移。那么该怎么办呢?为方便表达隐藏黑色命令框,只贴出线程run函数部分代码如下:

def run(self):
        命令 = subprocess.Popen("ping "+ self.V_IP4 ,shell = True)
        命令.wait()
        self.读取PING结果()
        if self.返回信息[3] != "超时":
            self.读取PLC数据()
            IP查询结果列表.append(self.返回信息)

使用subprocess.Popen()函数即可隐藏海量的黑色命令框,解救电脑于水火。若需要等待Popen()函数调用完毕后在往后执行,则需要使用,如代码中命令.wait()所示。

四、 构建EXE打包器,一键生成exe

Python-tkinter-pyinstaller项目之EXE打包器

总结

上述为我自己亲身测试后的结果,若有不同意见可以沟通,也可相互讨论学习。
欢迎各位看官浏览本人的系列文章:
1. python tkinter GUI简单化编程之文章目录2. python项目实战之目录