注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

python 程序打包exe文件 工具(pyinstaller,EXE)  

2012-08-14 15:13:09|  分类: Web技术-Python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一说明
   将python程序打包成EXE格式的工具有很多,比如py2exe、pyinstaller等等。这里我使用pyinstaller工具来进行打包。

二过程
1 准备要打包的程序
   由于这里只是一个简单的演示,所以我拿http://fc-lamp.blog.163.com/blog/static/1745666872012784515541/ 这篇文章中的代码来修改一下。
   代码中要注意编码问题,因为编码所在系统(输出)环境是GBK(中文),而百度的新版空间网页编码已更改为UTF-8编码,所以要注意转换一下。
spider.py

#coding:gbk
import urllib2,urllib,re,os
import cookielib,time

'''
百度爬虫类
@author:FC_LAMP
'''
class SpiderBaiDu:

#变量
sqlit = None
cur = None
baseurl = 'http://hi.baidu.com/new/'
total = 0

header = {'User-Agent':'Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2'}

#处理单引号
def qutoSin(self,string):
return string.replace("'","")


#登陆百度空间
'''
user 为用户名
pwd 为password
'''
def LoginBaiDu(self,user,pwd):

#设置
cookie = cookielib.CookieJar()
cookieProc = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(cookieProc)
urllib2.install_opener(opener)

#请求
post = {
'username':user,
'password':pwd,
'tpl':'mn',
'u':'http://www.baidu.com/',
'psp_tt':0,
'mem_pass':'on'
}
post = urllib.urlencode(post)

req = urllib2.Request(
url='https://passport.baidu.com/?login',
data=post,
headers = self.header
)
res = urllib2.urlopen(req).read(500)

if 'passCookie' in res:
flag = True
else:
flag = 'Login Fail:%s'%user

return flag


#分析页面
def parse_html(self,domain,msg,debug=False):

url = self.baseurl+domain
#获取第一篇文章
c = urllib2.urlopen(url).read()
qbid = re.compile('.*?data-blogid="(.*?)".*?',re.S|re.I|re.U)
qbid = qbid.search(c)
if qbid==None:
raise Exception('此空间已被关!')
qbid = qbid.group(1)
url = 'http://hi.baidu.com/%s/item/%s'%(domain,qbid)

#开始解析
postedit_url = 'http://hi.baidu.com/pub/submit/modifytext';

i = 0 #禁言次数
while True:
c = urllib2.urlopen(url).read()
if debug:
#获取标题:
title = re.compile(
'<title>(.*?)<\/title>',
re.S|re.I|re.U
)
title = title.search(c)
#解析成uncode对象
title = title.group(1).decode('utf-8')
print title
print url

#获取下一篇连接
nexturl = re.compile(
'<div.*?class="detail-nav-pre">.*?<a.*?href="(.*?)".*?hidefocus.*?><\/a>.*?<\/div>',
re.S|re.I|re.U
)
nexturl = nexturl.search(c)

#获取token
modify_url = 'http://hi.baidu.com/pub/show/modifytext?qbid='+qbid
modify_c = urllib2.urlopen(url).read()
qbtoken = re.compile(
'window.qBdsToken="(.*?)";'
)
qbtoken = qbtoken.search(modify_c).group(1)
#编码传回百度
postmsg = unicode(msg,'gbk').encode('utf-8')
#提交数据
postdata={
#'title':'愤怒离开:http://fc-lamp.blog.163.com/',
'content':postmsg,
'qbid':qbid,
'bdstoken':qbtoken,
}
postdata = urllib.urlencode(postdata)
req = urllib2.Request(
url=postedit_url,
data = postdata,
headers = self.header
)
res = urllib2.urlopen(req).read()

#换成dict
res = eval(res)
if res['errorMsg']!='':
i+=1
if i>=2:
print '哎~~又被禁言了,休息四分种吧。'
time.sleep(240)
else:
print '哎~~又被禁言了,休息两分种吧。'
time.sleep(120)
continue
else:
i=0

#是否还有下一篇
if nexturl==None:
break
url = self.qutoSin(nexturl.group(1).strip()).replace("\\",'')
qbid = url.split('/')[-1]



#例子
if __name__ =='__main__':
while True:
print '---================----'
print '特别说明:此程序仅做程序学习所用,严禁任何形式的商业用途,否则后果自负!!!'
print ' Author:FC_LAMP Blog: fc-lamp.blog.163.com 退出:quit'
print '---================----\n\n百度空间文章批量修改'

user = str(raw_input('\n你的用户名(回车确定):'))
pwd = str(raw_input('\n你的密码(回车确定):'))
print '登录中.....'
spider = SpiderBaiDu()
f = spider.LoginBaiDu(user,pwd)
if f == True:
print '登录成功!'
url = str(raw_input('你的空间域名(回车确定):'))
flag = str(raw_input('你确定要批量修改百度空间中的所有文章吗?(y/n)')).lower()
if flag =='y':
msg = str(raw_input('请输入新的内容:'))
st = time.time()
try:
print '解析中.......'
spider.parse_html(url,msg,debug=True)
except Exception as e:
print '解析错误!空间无法被正常解析!空间是否被度娘关了(或没有文章)?'
et = time.time()
c = et - st
print('批量操作结束,耗时:%0.2f'%c)
else:
print ''
else:
print(f)




2 安装相关打包程序
pyinstaller工具可以在  http://www.pyinstaller.org/ 官网下载,但是如果是使用window方式来安装pyinstaller还需要一个扩展pywin32,可以
  在这里下载:http://sourceforge.net/projects/pywin32/files/pywin32/Build%20217/ 选择一个合适的版本。

 /******************************20170224更新*************************/
 现在官网上的版本也是3.2版本的了,而且包文件PyInstaller-3.2.1.zip下载下来后发现不全,其官网也推荐使用pip的方式来安装,下面我们就使用pip的方式来安装pyinstaller3版本
(注:这里也需要先安装好pywin32的,我们可以使用 import win32com 来确认是否已安装了pywin32)。
首先我们进入https://pypi.python.org/pypi/pip#downloads 找到 pip-9.0.1.tar.gz (md5, pgp) ,点击下载即可。
然后我们减压后,cd 进入pip目录,执行:
python setup.py install //注意这里我们把python添加系统环境变量了,所以可以直接使用python 命令
安装后,我们进入:D:\intall\python2.7\Scripts,我们可在这里找到pip.exe, 我们执行一下命令:
pip -V
python 程序打包工具(pyinstaller,EXE) - fc_lamp - @fc_lamp

说明pip已安装成功,然后我们再使用
pip install PyInstaller
同样的,我们进入D:\intall\python2.7\Scripts,发现pyinstaller.exe已有了。
这样我们的pyinstaller 3就安装成功了。 

3  打包你的程序

  首先安装好pywin32后,再按官网文档说明来安装pyinstaller。
  一切安装好后,我们来实际最简单的打包。
  1 进入pyinstaller的安装目录,将要打包的程序(spider.py)放在pyinstaller目录下。
     201702更新:在pyinstaller3中pyinstaller已是一个exe程序了,要打包的python代码各在任意目录都可。
  2 打开CMD,进入到pyinstaller的安装目录,输入命令:python pyinstaller.py spider.py 
     201702更新: pyinstaller  spider.py

  到这一歩,相关的文件包已产生,更多的信息参看: http://www.pyinstaller.org/export/v2.0/project/doc/Manual.html?format=raw 
   201702更新: 执行打包命令后我们可在D:\intall\python2.7\Scripts 目录中发现多了两个目录
   build(编译的目录) dist(打包后目标目录,我们的EXE就放在这里)
   python 程序打包工具(pyinstaller,EXE) - fc_lamp - @fc_lamp
   进入dist后,就可看到我们的EXE程序了,默认情况下pyinstaller会是以目录方式打包,即生成一个spider目录,里面有很多相关的文件,如下:

python 程序打包工具(pyinstaller,EXE) - fc_lamp - @fc_lamp
 可我们通常希望只需要一个exe文件就可以了,那么只需要 -F 参数即可
  pyinstaller  -F  spider.py

 我们点击EXE效果图:
python 程序打包工具(pyinstaller,EXE) - fc_lamp - @fc_lamp

   3 更多参数:
      pyinstaller -F -n test -p D:\python2.7\Lib;E\python\test; -i D:\test\test.ico      D:\test\test.py
      -F生成单个EXE文件
      -n exe名称
      -p 需要使用的包,多个包使用; 分隔
      -i 使用ico图标(注意:ico图标一定是合法的ico文件,不然会报错)

   
        



 
  评论这张
 
阅读(1940)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017