呓语 | 杨英明的个人博客

专注于c++、Python,欢迎交流

By

使用pyInstaller发布PathMerge的exe版本(py转换成exe)

前言

PathMerge是用python写的一个辅助文件夹合并的小工具,它的特点是不用担心合并后文件会丢失,旧文件会创建副本保存下来,除非你手动删除。

详情见:python开发目录合并小工具 PathMerge

由于PathMerge使用python写的,运行需要有python的环境,如果想把它转换成exe可执行文件怎么办呢?

我们可以用pyInstaller来将py文件转换成exe文件。

pyInstaller相对另一款py转exe的工具py2exe的优点在于,转换之后的exe文件无需任何支持文件,即使在没有python环境的机器上也能运行。

而py2exe转换成的exe文件需要库文件的支持,也就是说你需要把exe文件和一大堆库文件拷到一个目录下才能运行,使用起来不太方便。

使用pyInstaller唯一的缺点是转换出来的exe文件只能在英文目录下运行,中文目录下会报错。

很遗憾没有找到一款支持中文的转换工具。

pyInstaller使用

使用pyInstaller转换py文件其实很简单,在windows命令提示符中执行一条命令即可

python [PyInstaller Path] --console --onefile [PythonFile]

[PyInstaller Path] 为 pyinstaller.py 安装器的目录位置
[PythonFile] 为待转换py文件的名称

安装环境

1、PyInstaller-3.1.1.zip   

  下载地址:http://www.pyinstaller.org/

  最新版本可能已经更新

2、pywin32-220.win32-py2.7.exe

  下载地址:https://sourceforge.net/projects/pywin32/files/pywin32/Build%20220/

  访问windows系统API的库

3、python2.7.11

  下载地址:https://www.python.org/downloads/release/python-2711/

  默认安装

效果演示 

先说明一下运行目录。

运行环境所需文件都已放在InstallPackage中

其中pyInstaller已经解压到当前文件夹,pywin32也已经安装好。

下面演示一下如何将PathMerge打包成exe文件。

我已经提前写好了转换脚本——py2exe.py,代码见下节。

三种运行方式:

1、双击运行py2exe,输入待转换文件名称

运行

2、将待转换文件拖到py2exe.py文件上,松手,直接运行

运行结果和上一种方式基本一样。

3、命令行调用。

运行结果和第一种方式一样,这种方式可用来写脚本。

脚本运行之后会在当前目录下生成一个与待转换文件同名的exe文件,见下图

exe文件运行效果和python程序是一样的。

代码

转换脚本在这里~ 作抛砖引玉用。

 1 # coding=gbk
 2 
 3 # py2exe
 4 # 作者:freecode
 5 # 创建时间:2016/5/11 10:54
 6 # 作用:
 7 #   将python脚本转换成windows下exe可执行文件
 8 # 执行条件:
 9 #   1、pyInstall已安装,安装目录在.\InstallPackage目录下
10 #   2、pywin32-220.win32-py2.7.exe已安装
11 #   3、所在目录必须为中文
12 #
13 
14 import os
15 import shutil
16 import sys
17 
18 class Py2Exe:
19    def py2exe(self,argv=None):
20         if argv==None:
21             FileName = raw_input('请输入待转换py文件名称(必须在当前目录下):').strip()
22         else:
23             FileName = argv[1].strip()
24             
25         if FileName[0]=='\"' or FileName[0]=='\'':   # 去除引号
26             FileName = FileName[1:-1]
27         FileName = FileName.split('\\')[-1]    # 截取文件名
28         
29         # 生成exe文件
30         CurrentPath = os.getcwd()       
31         PyInstaller = sys.path[0]+"\\InstallPackage\\PyInstaller-3.1.1\\pyinstaller.py"   # 安装器位置
32         PyFile_1 = sys.path[0]+'\\'+FileName              # 转换文件
33         SpecFile = CurrentPath+'\\'+FileName[:-3]+'.spec'     # 要删除的spec文件
34         ExeFile_1 = "%s.exe"%(FileName[:-3])        # 生成的exe文件名
35         ExePath_1 = "%s\\dist\\%s"%(CurrentPath,ExeFile_1)  # exe文件所在目录
36         CopyPath_1 = "%s\\%s"%(CurrentPath,ExeFile_1)        # exe文件复制目录
37 
38         if os.path.exists(sys.path[0]+'\\'+ExeFile_1):
39             print "%s已存在,不需要转换"%(ExeFile_1)
40             return False
41         else:
42             # 转换开始
43             os.system('python "%s" --console --onefile "%s"'%(PyInstaller,PyFile_1))
44 
45 
46         # 移动exe文件,删除多余文件
47 
48         if os.path.exists(ExePath_1):
49             print 'exe生成完毕'
50             print '复制文件%s到%s……' % (ExePath_1,CopyPath_1)
51             shutil.copy(ExePath_1,CopyPath_1)
52             if argv != None:
53                 print '复制文件%s到%s……' % (CopyPath_1,sys.path[0]+'\\'+ExeFile_1)
54                 shutil.move(CopyPath_1,sys.path[0]+'\\'+ExeFile_1)
55         else:
56             print 'exe生成失败'
57             print '文件%s不存在'%(ExePath_1)
58             return False
59             
60         if os.path.exists(CurrentPath+"\\dist"):
61             print '删除目录%s……' % (CurrentPath+"\\dist")
62             shutil.rmtree(CurrentPath+"\\dist")
63         else:
64             print '目录%s不存在'%(CurrentPath+"\\dist")
65             return False
66 
67         if os.path.exists(CurrentPath+"\\build"):
68             print '删除目录%s……' % (CurrentPath+"\\build")
69             shutil.rmtree(CurrentPath+"\\build")
70         else:
71             print '目录%s不存在'%(CurrentPath+"\\build")
72             return False
73 
74         if os.path.exists(SpecFile):
75             print '删除文件%s……' % (SpecFile)
76             os.remove(SpecFile)
77         else:
78             print '文件%s不存在'%(SpecFile)
79             return False
80         return True
81             
82         
83 if __name__=='__main__':
84     # 判断是否是在直接运行该.py文件
85     if len(sys.argv)==1:
86         Py2Exe().py2exe()
87     elif len(sys.argv)==2:
88         Py2Exe().py2exe(sys.argv)
89     else:
90         print 'ERROR:参数错误!\n'
91     raw_input('\n请按回车键(Enter)退出……')
92 
93     

注意

Sorry,目前仅支持windows环境……

原创声明

Freecode# : www.cnblogs.com/yym2013

 

##原创声明 **转载请注明:[呓语](http://www.yangyingming.com) » [使用pyInstaller发布PathMerge的exe版本(py转换成exe)](http://www.yangyingming.com/article/26)**