Pyinstaller打包Selenium脚本为exe文件执行问题
由于同事辞职,许多运维工具的维护工作就交到我这里处理了,运维居然没人会Python脚本!
用Selenium编写的一个爬虫脚本cctv.py,需要给不懂软件的人运行。为了不让他去搭建,安装各种包,库,所以将脚本打包成exe文件给他直接使用。
运行环境Ubuntu-16.04
所需要的基本工具:
1. Pyinstaller:打包工具
2. xvfb: 虚拟显示框架
一. 安装Pyinstaller
注意:如果你要在Linux下运行,那么就在Linux下打包编译。
zhuben@zb:~$ pip install pyinstaller
下载的是3.2版本。
二. 安装xvfb
zhuben@zb:~$ sudo apt-get install xvfb
下载后我没有测试过,下载过程没有报错就OK,如果要测试是否成功,可以在网上搜索。
三. 打包cctv.py脚本
zhuben@zb:~$ pyinstaller --onefile cctv.py
运行之后会看到很多打印信息。完成后会生成build\和dist\文件夹,cctv.spec文件
生成的exe文件其实是根据.spec文件中的内容来生成的,可以打开查看。
如果已经有了.spec文件,就可以直接运行
zhuben@zb:~$ pyinstaller cctv.spec
进入dist\文件夹会发现cctv.exe文件。如果想了解更多参数,可以参考官方文档
运行试试看
如果出现IOError:/tmp/_MEISGj2tQ/selenium/webdriver/firefox/x86/x_ignore_nofocus.so之类的缺少文件错误。那就需要修改.spec文件
原内容为:
a = Analysis(['main.py'],
pathex=[...],
binaries=None,
datas=None,
...)
要手动将缺少的文件路径加上去
改为:
a = Analysis(['main.py'],
pathex=[...],
binaries=None,
datas=[
('/usr/lib/python2.7/site-packages/selenium/webdriver/firefox/x86/x_ignore_nofocus.so', 'selenium/webdriver/firefox/x86'),
('/usr/lib/python2.7/site-packages/selenium/webdriver/firefox/amd64/x_ignore_nofocus.so', 'selenium/webdriver/firefox/amd64')
],
...)
以上路径需要改为你自己机子上.so文件所在路径
内容来自参考:Pyinstaller遇到的问题
解决之后,发现没有出现Runtime问题了,但是有WebDriverException:
selenium.common.exceptions.WebDriverException: Message: The browser appears to have exited before we could connect.
这就是因为没有显示器的原因,所以需要xvfb搭建一个虚拟的环境。关于xvfb的更多内容可以自行搜索
四. 使用xvfb
zhuben@zb:~$ Xvfb -ac :10 &
zhuben@zb:~$ export DISPLAY=:10 #将显示连接到xvfb所创建的环境
再来运行cctv.exe,发现可以正常运行了.
或者执行
zhuben@zb:~$ xvfb-run --auto-servernum --server-args="-screen 0 1280x760x24" ./cctv.exe
五. 优化
如果每次需要运行脚本的时候都加上这么多命令的话,很是不方便。所以,我就将xvfb的启动/关闭命令加到了爬虫脚本中
if __name__ == "__main__":
os.system("nohup Xvfb -ac :10 &")
main()
os.system("sudo killall Xvfb")
然后用sudo ./cctv.exe执行
但是这样加上去是不能执行的,原因就是缺少了设置DISPLAY变量 export DISPLAY=:10
但是Python脚本中是加入不了export 命令的。原因参考:How to user export in Python on Linux
所以:要么执行sudo ./cctv.exe之前,执行export DISPLAY=:10;要么就将export DISPLAY=:10加入到.bashrc中去。
六.遇到的问题
1.Exec format error.Binary file not executable:
文件格式错误,确保你的exe文件是在你当前的系统中生成的。虽然Pyinstaller是跨平台的,但是他打包之后的exe文件并不能跨平台执行。也就是说,在win下打包生成的exe文件只能在win下运行;在linux下打包生成的exe文件,只能在linux下运行。开始并不知道这个,总是在win下打包好后,传到ubuntu下去运行
2.开启了xvfb,但是还是提示WebDriverException:
确保你的DISPLAY 的值和你xvfb设置的值是一致的。xvfb设置为 :10, 那么你就需要 export DISPLAY=:10。可以输入export查看所有变量
七. 其他
Pyinstaller打包Selenium脚本为exe文件执行问题的更多相关文章
- PyInstaller打包Python脚本为exe
1.PyInstaller-3.1.1 百度云链接 http://pan.baidu.com/s/1jHYWin8 密码 oapl 2.安装最新版本的 pywin32-217.win32-py2 ...
- “failed to excute script xxx” PyInstaller 打包python程序为exe文件过程错误
在使用PyInstaller打包python程序,打包命令为: pyinstaller -F -w -i manage.ico yourpyfile.py 顺便说一下几个参数的作用 -F:是直接生成单 ...
- pyinstaller 打包selenium脚本 取消cmd
更改源代码 找到文件(selenium->webdriver->common->service.py) 添加一个参数
- 打包python脚本为exe可执行文件-pyinstaller和cx_freeze示例
本文介绍使用cx_freeze和pyinstaller打包python脚本为exe文件 cx_freeze的使用实例 需要使用到的文件wxapp.py, read_file.py, setup.py ...
- 打包python脚本为exe的坎坷经历, by pyinstaller方法
打包python脚本为exe的坎坷经历, by pyinstaller方法 又应验了那句歌词. 不经历风雨, 怎么见得了彩虹. 安装过程略去不提, 仅提示: pip install pyinstall ...
- sublime添加自己的编译环境_添加一个.app或者.exe文件执行脚本
如何添加一个.app或者.exe文件执行脚本 看了很多简书和博客,还是搞不好,最后参考官方文档搞定了: http://www.sublimetext.com/docs/3/build_systems. ...
- Pyinstaller打包selenium去除chromedriver黑框问题解决!!!
Pyinstaller打包selenium去除chromedriver黑框问题解决!!! 问题描述 [1123/101706.932:ERROR:gpu_process_transport_f ...
- PyInstaller打包python脚本的一些心得
PyInstaller打包python脚本的一些心得 因为在公司经常要帮同事做一个从excel表格中提取出需要的内容的重复工作,比较繁琐还容易出错:于是就想着要写个程序,但是同事又不可能在电脑上也装上 ...
- pyinstaller打包.py程序为.exe操作指南
pyinstaller打包.py程序为.exe操作指南 20190526内容纲要: 1.pyinstaller安装 2.程序封装 3.可执行程序 0 前言 今天第一次试试将一个py程序封装成一个.ex ...
随机推荐
- mysql大数据分表后查询
当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度,举例说明: 1亿条数据,分100张表 1.首先创建100张表 $i=0;while($i<=99){echo "$n ...
- 使用filter获取http请求的出参以及入参
首先 我们的目的是做一个拦截器 能够对http请求做profiler,能够记录本次的调用情况,这里说下如何从http请求中获取到出参的问题. 方案一:参照http://blog.csdn.net/wu ...
- JVM内存管理
前几天公司的郑大晔校上,XXX同事做了JVM的Session,于是趁端午节放假的功夫,研究了一些JVM相关的知识. 在Java生态系统中,JVM占据至关重要的作用,就像一个适配器,它向编程语言(主要是 ...
- sql逻辑执行顺序
要知道SQL语句,我想我们有必要知道SQL Server查询分析器怎么执行我们的SQL语句的,我们很多人会看执行计划,或者用Profiler来监视和调优查询语句或者存储过程慢的原因,但是如果我们知道查 ...
- Linq to SQL 的增删改查操作
Linq,全称Language Integrated Query,是C#语言的一个扩展,可以将数据查询直接集成到编程语言本身中. Linq分为查询语法和方法语法,说白了查询语法就是 from wher ...
- Android 开发之 ---- 底层驱动开发(一) 【转】
转自:http://blog.csdn.net/jmq_0000/article/details/7372783 版权声明:本文为博主原创文章,未经博主允许不得转载. 驱动概述 说到 Android ...
- FTP连接时出现“227 Entering Passive Mode” 的解决方法
今天从公网的服务器连接本地内网的FTP server copy文件时,系统老是提示227 Entering Passive Mode (xxx,xxx,,xxx,xxx,x),很是奇怪,于是上网找资料 ...
- vi编辑器的常规使用
1.命令模式(command mode)-执行命令 在该模式中,可以输入命令来执行许多种功能.控制屏幕光标的移动,字符.字或行的删除,移动复制某区段及进入Insert mode下,或者到 last l ...
- er3
<html xmlns:v="urn:schemas-microsoft-com:vml"xmlns:o="urn:schemas-microsoft-com:of ...
- 1.[WP Developer体验Andriod开发]之Andriod布局 VS WinPhone布局
0.写在前面的话 近来被HTML+CSS的布局折腾的死去活来,眼巴巴的看着CSS3中的flex,grid等更便捷更高效的的布局方式无法在项目中应用,心里那叫一个窝火啊,去你妹的兼容性,,, 最近体验下 ...