目录
我们在pycharm上写的程序在发送到一台没有安装python解释器的机器上是不能运行的,甚至还要安装程序中所使用的第三方包,这样极其不方便。但是PC是可以直接运行.exe文件的,因此我们通过将程序打包成.exe进行执行,做到分享即可用。
PS: 如果打包为exe的话,版本尽量选择python3.6+32位版本,因为win64位系统向下兼容32位程序,但是如果不考虑32位系统的话无所谓,直接python64位版本直接打包就可以,只是只能在win64位系统上跑。
首先安装pyinstaller,使用安装命令:pip install pyinstaller;使用清华大学镜像源加快速度:
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
结果如下:

我已经安装过了,所以会显示已经存在。
我们写的python脚本是不能脱离python解释器单独运行的,所以在打包的时候,至少会将python解释器和脚本一起打包,同样,为了打包的exe能正常运行,会把我们所有安装的第三方包一并打包到exe。
即使我们的项目只使用的一个requests包,但是可能我们还安装了其他n个包,但是他不管,因为包和包只有依赖关系的。比如我们只装了一个requests包,但是requests包会顺带装了一些其他依赖的小包,所以为了安全,只能将所有第三方包+python解释器一起打包。
cmd进入py程序项目目录,执行命令:
pyinstaller -F -w -i xxx.ico main.py --noconsole
或者:
pyinstaller -F -w --icon=xxx.ico main.py --noconsole
ps: -F参数表示覆盖打包,这样在打包时,不管我们打包几次,都是最新的,固定命令。-w表示窗体程序,--icon是设置exe的显示图标,'main.py'是程序的入口(如果是单个文件就换成文件名,如:hello.py),--noconsole 表示不展示cmd窗口,反过来想看cmd窗口就改成--console。*.ico文件可以到网上ico矢量图在线转换工具处理。
常用打包命令:
打包exe:pyinstaller -F setup.py
不带控制台的打包:pyinstaller -F -w setup.py
打包指定exe图标打包:pyinstaller -F -i xx.ico setup.py
多个.py文件打包命令格式如下:
pyinstaller [主文件] -p [其他文件1] -p [其他文件2] --hidden-import [自建模块1] --hidden-import [自建模块2]
具体看:Pyinstaller打包多个.py文件_拓跋梁哲的博客-CSDN博客_pyinstaller打包多个py文件
对PyQt5(一) PyQt5安装及配置,从文件夹读取图片并显示,模拟生成素描图像中的程序进行打包测试:

其中main.py是主程序入口文件,其他.py文件是自建模块,需要在主文件中使用。
cmd进入此项目目录进行打包:
pyinstaller -F -i crack.ico -w VIPCracker.py -p CholenSql.py -p ImgICon.py -p VIPGUI.py --hidden-import CholenSql --hidden-import ImgICon --hidden-import VIPGUI
pyinstaller -F -w main.py -p enterTest1.py -p enterTest2.py -p test1.py -p test2.py --hidden-import enterTest1 --hidden-import enterTest2 --hidden-import test1 --hidden-import test2



打包完成后出现了main.exe文件,现在运行它看是否会正常执行:

可见打包是成功的,但是有一个缺陷,就是这个.exe非常大,足足有281M。

通过检查发现,是因为在打包的时候pyinstaller会自动收集打包过程所需的一些py依赖包,而我是用Anaconda自带的base进行程序运行的,而其中安装了很多第三方库,以至于都会被打包起来。
为了解决不将程序相关的第方三库一起打包,一个最直接的想法是新建一个虚拟环境,里面只装我们当前项目需要的py包,这样打包过程中就不会搞进去一些没用的py包了。我们在Anaconda中创建一个新的虚拟环境运行PyQt项目:pyqt_env
命令详见:Anaconda中虚拟环境在命令行中的查看、创建、切换


进入新的虚拟环境查看安装的第三方模块:

可以看到它依旧自带了太多的第三方库,由于没有找到在anaconda下创建“干净的”虚拟环境方法,因此删除后用Python3.3 之后的模块 venv 代替 virtualenv 工具(用venv的好处是不用单独安装,3.3 及之后的版本,都可以使用此创建虚拟环境)来创建虚拟环境:
在D:\python\Anaconda\envs目录下用venv模块创建一个虚拟环境:

激活虚拟环境:
cmd进入D:\python\Anaconda\envs\pyqt_env\Scripts下,然后输入激活命令:activate.bat(或者直接输入activate);退出虚拟环境:deactivate.bat

可以看到只有两个基本包,达到目的。安装本次测试需要的包:

pycharm添加新创建的虚拟环境:


添加新环境之后确保程序可以正确运行,然后cmd进入新创建的虚拟环境, 安装 pyinstaller,再cd到项目文件夹:
pyinstaller -F -w main.py -p enterTest1.py -p enterTest2.py -p test1.py -p test2.py --hidden-import enterTest1 --hidden-import enterTest2 --hidden-import test1 --hidden-import test2

打包结果如下:


可以看到从原来的281M降到了79.3M,达到了我们期望的目标。
本次实验练习将程序打包成.exe文件,同时创建了用不同方法新的虚拟环境。
参考文章:
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta