手动实现把python项目发布为exe可执行程序过程分享

1. 手动制作python的exe可执行程序Python没有内建一个编译为exe的功能。给python程序的部署带来不少的麻烦。所以就会出现一些py2exe之类的很不错的工具,用于自动把.py文件编译为.exe文件。

最近抽空研究了一下手动实现类似py2exe的功能,希望加强对python的了解。结果还相当不错。把结果记录下来,与大家共享。

1.1. 原理文中所描述的方法,基于python的以下几个功能

1) python程序运行时,会在sys.path指定的路径中查找库文件。 
  2) python从2.3开始,支持从zip文件中import库(支持.py,.pyc和.pyo,但不支持.pyd)
  3) python提供C API,让c语言的程序,可以很方便的调用python的程序

1.2. 实际步骤注:假设python安装在c:\python25目录中,最后的可执行文件放到d:\dist目录中

1) 先去c:\python25\Lib目录,把所有文件都复制出来,比如复制到d:\pythonlib目录中
  2) 开一个cmd窗口,进入d:\pythonlib目录中,运行 python -OO compileall.py -f . 把lib中的.py文件都编译成.pyo文件
  3) 删除d:\pythonlib目录中所有的.py和.pyc文件,因为我们只要有.pyo文件就可以让这些库运行了。
  4) 删除目录中所有用不着的文件,比如curses,test,idlelib,msilib等,以减少生成文件的体积。
  5) 把这些库打包成一个zip文件,比如stdlib.zip,放到d:\dist目录中
  6) 把c:\python25\dlls目录中的.pyd和.dll文件,复制到d:\dist\dlls目录中,当然,删除不可能用到的一些文件_msi.pyd,_ssl.pyd等等,可以减少文件的体积
  7) 把自己写的程序,也按步骤2至步骤5所说的方法,打成一个mysrc.zip包,放到d:\dist目录中。 注意:自己写的程序的入口应该是main.pyo文件
  8) 用以下C程序编译出一个可执行文件,比方说叫runpy.exe,也放到d:\dist中。

代码如下:

#include <Python.h>
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
       // 得到当前可执行文件所在的目录
       char szPath[10240];
       char szCmd[10240];
       GetModuleFileName(NULL, szPath, sizeof(szPath));
       char* p = strrchr(szPath, '\\');
       if (p == NULL)
       {
            printf("Get module file name error!\n");
            return -1;
       }

*p = 0;

// 设定运行时的PATH
       sprintf(szCmd, "PATH=%s\\dlls;%%PATH%%", szPath);
       _putenv(szCmd);

// 把sys.path设定为['.', '自己的源代码zip文件', '标准库zip文件', 'dll目录']
       // 然后调用main模块
       sprintf(szCmd,
            "import sys\n"
            "sys.path=['.', r'%s\\mysrc.zip', r'%s\\stdlib.zip', r'%s\\dlls']\n"
            "import main\n",
            szPath, szPath, szPath);
     
       Py_OptimizeFlag = 2;
       Py_NoSiteFlag = 1;
       Py_Initialize();
       PyRun_SimpleString(szCmd);
       return 0;
}

9. 把python25.dll放到d:\dist目录中。

结束语

这样来,d:\dist目录中,一共只有4个文件加一个目录:
dlls目录:用于存放所有的dll文件和pyd文件
stdlib.zip文件:用于存放所有的python的.pyo文件格式的标准库
mysrc.zip文件:用于存放自己写的程序。注意,自己写的程序的入口在main.pyo中。
runpy.exe文件:程序的启动文件,启动后会设定python的sys.path,然后调用main模块
python25.dll文件:python的核心dll,runpy.exe依赖于这个dll

--------------------------------------------------------------------------------

哈哈,相当的简洁明了吧。一共才4个文件一个目录,5MB都不到哦。
注:当然,这种打包方式第一次做的时候比较麻烦,但之后就可以只要把自己的程序打包就好了,其它的不用变。
而且,如果自己的程序经常做改动的话,自己的程序也可以不打包,直接放到d:\dist中,反正runpy.exe启动程序的时候,只要能正常运行import main就可以了。

(0)

相关推荐

  • 零基础写python爬虫之打包生成exe文件

    1.下载pyinstaller并解压(可以去官网下载最新版): https://github.com/pyinstaller/pyinstaller/ 2.下载pywin32并安装(注意版本,我的是python2.7): https://pypi.python.org/pypi/pywin32 3.将项目文件放到pyinstaller文件夹下面(我的是baidu.py): 4.按住shift键右击,在当前路径打开命令提示行,输入以下内容(最后的是文件名): python pyinstaller.

  • 将Python代码打包为jar软件的简单方法

    py 写东西快 但是java 生态广 比如大数据 py 虽然好 但是利用不到java的整个的生态的代码 scala 虽然也好但是毕竟 有些库 需要自己写的多 虽然也很简单 ,但是查文档也很麻烦 那么 问题来了 最简单的的方式就是直接把py 打包 jar 那么 问题又来了 py 打包成java 挺麻烦的 官方文档看不懂 答案 有了 写了个 包 https://github.com/yishenggudou/jythontools 搞这个事情 timger-mac:test timger$ pyth

  • 使用cx_freeze把python打包exe示例

    需要使用到的文件wxapp.py, read_file.py, setup.py 复制代码 代码如下: #!/usr/bin/env python# -*- coding: utf-8 -*-#file: wxapp.py import wximport osimport sysimport read_file class Frame(wx.Frame):    def __init__(self):        wx.Frame.__init__(self, parent=None, tit

  • Python打包文件夹的方法小结(zip,tar,tar.gz等)

    本文实例讲述了Python打包文件夹的方法.分享给大家供大家参考,具体如下: 一.zip import os, zipfile #打包目录为zip文件(未压缩) def make_zip(source_dir, output_filename): zipf = zipfile.ZipFile(output_filename, 'w') pre_len = len(os.path.dirname(source_dir)) for parent, dirnames, filenames in os.

  • Python脚本文件打包成可执行文件的方法

    将Python脚本文件包装成可执行文件,其目的有二: 一则: 不需要依赖Python编译器就可以运行软件 二则: 不想让自己的源码公布出去 常用的工具有: py2exe.cx_freeze等 [工具:py2exe] 安装py2exe 安装该工具很简单: 只需要从官方网站:http://www.py2exe.org/下载与版本对应的安装程序,点击下一步即可完成安装. 安装后,执行import py2exe,不报错则表示安装成功! 复制代码 代码如下: >>> import py2exe 

  • 打包发布Python模块的方法详解

    前言 昨天把自己的VASP文件处理库进行了打包并上传到PyPI,现在可以直接通过pip和easy_install来安装VASPy啦(同时欢迎使用VASP做计算化学的童鞋们加星和参与进来), VASPy的GotHub地址:https://github.com/PytLab/VASPy VASPy的PyPI地址:https://pypi.python.org/pypi/vaspy/ 由于自己的记性真是不咋地,怕时间久了就忘了,于是在这里趁热打铁以自己的VASPy程序为例对python的打包和上传进行

  • python使用内存zipfile对象在内存中打包文件示例

    复制代码 代码如下: import zipfileimport StringIO class InMemoryZip(object):    def __init__(self):        # Create the in-memory file-like object        self.in_memory_zip = StringIO.StringIO() def append(self, filename_in_zip, file_contents):        '''Appe

  • python编程-将Python程序转化为可执行程序[整理]

    工欲善其事,必先利其器.python是解释型的语言,但是在windows下如果要执行程序的话还得加个python shell的话,未免也太麻烦了.而这里所说的东西就是将python程序转换为exe文件.下面是一些常用的工具,不过似乎py2exe应用的更加广泛一些.  py2exe     http://py2exe.sf.net 只支持windows平台,应该是大家听到最多的一个名字了,用户不少,所以有问题的话在它的mail list里面很容易找到答案.文档中提到了"无法找到某某code&quo

  • Python打包可执行文件的方法详解

    本文实例讲述了Python打包可执行文件的方法.分享给大家供大家参考,具体如下: Python程序需要依赖本机安装的Python库,若想在没有安装Python的机器上运行,则需要打包分发,目前有两个比较好用的工具:PyInstaller和py2exe.其中py2exe应用在windows下,而PyInstall则可应用windows.Linux以及Mac OS X上. 这里只贴一段py2exe打包的实例代码.(py2exe下载地址) #coding=utf-8 from distutils.co

  • 使用PyInstaller将Python程序文件转换为可执行程序文件

    Windows下采用PyInstall将py文件转换成exe可执行文件 好不容易写完的py文件,想做成exe文件,最开始选择用py2exe,结果生成的exe遇到两个问题, 1. py程序里print 的信息,cmd中执行tool后并没有显示在屏幕上: 2. 调用dll接口,执行py文件时是阻塞等待的,结果cmd中执行exe时,tool很快先返回了,接口还在运行,很诡异 一时找不到解决的办法,无奈弃用了,在网上找了pyinstall,试了一下,感觉功能更强大些... 安装PyInstaller之前

  • Python代码的打包与发布详解

    在python程序中,一个.py文件被当作一个模块,在各个模块中定义了不同的函数.当我们要使用某一个模块中的某一个函数时,首先须将这个模块导入,否则就会出现函数未定义的情况. 下面记录的是打包及安装包的方法. 本文示例是建立一个模拟登录的程序: logIn.py文件代码如下: pwd=int(raw_input('please input your passward: ')) if pwd==123: print 'success' else: print 'error' 一.打包 1.先建立一

随机推荐