目录
4. 打包selenium脚本时集成chromedriver.exe的问题
目的:将Python文件编译为exe文件后,可以直接在Windows上运行,不需要再依赖Python环境,可以复制到其他电脑中直接使用,较为方便。
pyinstaller是Python中将py文件编译成为exe文件的免费工具,较为好用,在Windows中,pyinstaller依赖pywin32,所在如果打包有问题请先安装pywin32模块,在Windows命令提示符中安装命令如下:
来源于互联网的pyinstaller资料,仅供参考。
https://so.csdn.net/so/search?q=pyinstaller&spm=1001.2101.3001.7020

Windows命令提示符
pip install pywin32
pip install pyinstaller
pyinstaller -F 文件名.py
在将带有tkinter等界面打包成exe时,运行exe文件的时候,会弹出一个DOS命令窗口,这个窗口可以看到一些打印信息,如果想只运行tkinter 页面,去掉dos命令窗口,需要在打包的时候 加上: -w
pyinstaller -F test.py -w
生成
-D, --onedir
创建一个包含可执行文件的单文件夹包(默认)
-F, --onefile
创建一个单一文件捆绑的可执行文件。
--specpath DIR
存放生成的spec文件的文件夹(默认:当前目录)
-n NAME, --name NAME
分配给捆绑的应用程序和规范文件的名称(默认值:第一个脚本的基本名称) [2]
Windows 和 Mac OS特定选项
-c, --console, --nowindowed
打开标准 i/o 的控制台窗口(默认)。在 Windows 上,如果第一个脚本是“.pyw”文件,则此选项无效。
-w, --windowed, --noconsole
Windows 和 Mac OS X:不为标准 i/o 提供控制台窗口。在 Mac OS 上,这也会触发构建 Mac OS .app 包。在 Windows 上,如果第一个脚本是“.pyw”文件,则会自动设置此选项。此选项在 UNIX 系统上被忽略。
-i <FILE.ico or FILE.exe,ID or FILE.icns or Image or “NONE”>, --icon <FILE.ico or FILE.exe,ID or FILE.icns or Image or “NONE”>
FILE.ico:将图标应用于 Windows 可执行文件。
FILE.exe,ID:从exe中提取带有ID的图标。
FILE.icns:将图标应用到 Mac OS 上的 .app 包。如果输入的图像文件不是平台格式(Windows 上的 ico,Mac 上的 icns),PyInstaller 会尝试使用 Pillow 将图标转换为正确的格式(如果安装了 Pillow)。
使用“NONE”不应用任何图标,从而使操作系统显示一些默认值(默认值:应用 PyInstaller 的图标)
其他参数
-h, --help
显示此帮助信息并退出
-v, --version
显示程序版本信息并退出。
--distpath DIR
捆绑应用程序的放置位置(默认:./dist)
--workpath WORKPATH
将所有临时工作文件、.log、.pyz 等放在哪里(默认:./build)
-y, --noconfirm
替换输出目录(默认:SPECPATH/dist/SPECNAME)而不要求确认
--upx-dir UPX_DIR
UPX 实用程序的路径(默认:搜索执行路径)
-a, --ascii
不包括 unicode 编码支持(默认:如果可用,包括在内)
--clean
在构建之前清理 PyInstaller 缓存并删除临时文件。
--log-level LEVEL
构建时控制台消息中的详细信息量。LEVEL 可以是 TRACE、DEBUG、INFO、WARN、ERROR、CRITICAL 之一(默认值:INFO)。
很多时候,我们的Python脚本文件本身是很小的,才几十KB,但编译后达到几十MB甚至上百MB,主要原因是在编译时会把Python环境及库一起打包到exe文件中,如果我们的Python环境中安装了很多包,比如通过Anaconda安装的Python环境时,通过会安装了很多Python库,如果在此环境中进行编译,那么就会把所有的库带上,导致编译后的exe文件很大。
为该文件单独创建相应的Python虚拟环境,只安装要编译Python文件所依赖的库(导入到该Python文件中的库),在该虚拟环境中安装pyinstaller编译工具(这点很重要),然后运行该虚拟环境,在虚拟环境下执行编译,这时文件就会小很多。
经测试十分有效,单独创建Python虚拟环境后编译,exe文件大小由原来的95MB减少到16MB,运行速度也快了10倍,原来界面加载出来要40~50秒,现在只要不到5秒。
安装virtualenv:
pip install virtualenv
然后创建一个虚拟环境:
virtualenv py2exe_env # 命名请自定义
创建完成以后,我们就会在创建的文件夹里发现虚拟环境命名的文件夹py2exe_env:

创建完成以后,我们就会在创建的文件夹里发现虚拟环境命名的文件夹py2exe_env
然后cd 到虚拟环境py2exe_env的Script目录下,输入如下命令启动虚拟环境:
pyinstaller -F 文件名.py -w # 运行时不出现dos命令窗口
&或者:
pyinstaller -F 文件名.py # 运行时出现dos命令窗口
这样就可以将Python代码文件编译成较小的exe文件!
采用pyinstaller 打包selenium项目时,一般需要再同级目录中添加谷歌浏览器chromedriver.exe驱动,否则会报错。在转发给其他人使用时,还要附带一个驱动,就会很不方便。通过如下方法可以解决此问题。
解决问题的关键,在代码中添加sys._MEIPASS路径,代码如下:
import sys
def getDriver():
if getattr(sys, 'frozen', False):
# 从exe包里找chromedriver依赖驱动的情况
chromedriver_path = os.path.join(sys._MEIPASS, "chromedriver.exe")
driver = webdriver.Chrome(chromedriver_path)
else:
# 普通情况下从本地文件路径找依赖的情况
driver = webdriver.Chrome(executable_path='本地chromedriver的路径') # 修改为自己电脑中chromedriver的路径
return driver
if __name__ == '__main__':
driver = getDriver()
driver.get('https://www.baidu.com')
#无论是本地调试还是打包成exe都不会再报错了。
注意:用 pyinstaller 打包生成的 exe 文件,在运行时动态生成依赖文件,sys._MEIPASS就是这些依赖文件所在文件夹的路径,通常为 C:\Windows\Temp_MEIxxxx 或C:\Users\用户名\AppData\Local\Temp_MEIxxxx,仅在 exe运行时有效,IDE运行时报错,因此需要通过判定条件兼顾。
用pyinstaller打包时,把chromedriver.exe添加进去,重新打包,然后就可以使用了,打包命令如下:
pyinstaller -F --add-binary "chromedriver.exe";"." 文件名.py # 把文件名换成你的文件名
打包完成后:,sepc文件中会出现添加了chromedriver.exe驱动,如下图所示:

您也可以参考以下资料:
https://www.jianshu.com/p/2c7c7dd602e2
https://www.zhihu.com/question/281858271
https://blog.csdn.net/wuchenlhy/article/details/81947159
https://blog.csdn.net/xiaofeixia666888/article/details/107258470/
https://blog.csdn.net/sinat_36797467/article/details/120288627?spm=1001.2014.3001.5501
https://blog.csdn.net/MAOZEXIJR/article/details/91971027
感谢您的阅读,如觉得有用请您点赞,您的鼓励是对我的最大动力!
END
2022/11/27
联系我:pengyu717@yeah.net
我有一个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看起来疯狂不安全。所以,功能正常,
关闭。这个问题是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上找到一个类似的问题
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
对于具有离线功能的智能手机应用程序,我正在为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-如何将脚
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除