实战py2exe 将docutils转换为EXE

本文原始链接:http://blog.csdn.net/liigo/archive/2006/11/11/1379374.aspx

py2exe,顾名思义,其作用就是将python源代码程序转换为可(脱离python环境)直接执行的EXE文件。

py2exe官方说明的很明白,它只是收集python程序中依赖的库/文件(*.pyc/py, python??.dll, ...)并将其打包,它生成的EXE其实还是需要python环境的,只不过自带了python环境而不需要用户自己安装罢了;这显然并非我先前想象的“类似GCJ那样将Java源代码直接编译为EXE,并脱离JVM独立运行”。

py2exe的处理方法跟易语言有相似之处。易语言编译生成的EXE也需要相应的支持库文件(至少包括核心支持库krnln.fnr/fne)才能运行,易语言的“独立编译”功能——即编译生成一个可不依赖外部支持库而独立运行的EXE——也是将支持库文件打包到EXE内部,运行时再将支持库文件从EXE中释放出来——也恰恰是这个“释放”功能,导致某些杀毒软件错误的认为该EXE是病毒。py2exe和易语言的不同之处在于,前者是一个程序,后者是一门编程语言。

py2exe可在这里下载:http://www.py2exe.org/

下面说一下python的基本用法。

首先写一个最简单的python程序,hello.py,我们的目标就是将它转换成hello.exe:

# hello.py

print   " hello from liigo "

另外还需要再写一个setup.py文件:

实战py2exe 将docutils转换为EXE # setup.py
实战py2exe 将docutils转换为EXE

实战py2exe 将docutils转换为EXE
from  distutils.core  import  setup
实战py2exe 将docutils转换为EXE
import  py2exe
实战py2exe 将docutils转换为EXE
实战py2exe 将docutils转换为EXE setup(console
= [ " hello.py " ])

注意上面最后一行中的“hello.py”就是要将其转换为EXE的python源代码文件。(官方要求该文件命名为setup.py,我试了一下,改成其它文件名,也可以正确的生成EXE啊。)

最后需要在命令行下执行以下命令(假设hello.py, setup.py都在C:\目录下):

c:\python setup.py py2exe

 好了,已经搞定了。到hello.py所在目录下看看,多出来两个目录 dist 和 build,这就是py2exe为我们生成的,其中dist目录有我们需要的hello.exe文件,build目录是py2exe使用的临时目录,没有用了,可以随时删除。注意,这里生成的hello.exe并不能独立运行,必须将dist目录下的所有文件都一起复制到另一台没有安装python的机器上才能保证可以正确执行。

我们的hello.py只有一行代码,可是生成的dist目录有3M多,压缩后也有1M多,好大呀。来看一下其中都有什么东东吧:

 实战py2exe 将docutils转换为EXE


 我今天用py2exe当然不是为了仅仅写个hello world出来,我的目标是用它将docutils转换为EXE。

要讲docutils先说reStructuredText,跟tex,apt,docbook相似的纯文本文档格式。docutils是一个python开源软件,可将reStructuredText文件转换html,xml,tex等多种格式。要了解docutils和reStructuredText的更多信息请参考:http://docutils.sourceforge.net/。(出自maven的apt (Almost Plain Text)非常不错,希望能出独立的解析工具,要是还能生成pdf,doc就更好了。)

本来以为这是很容易就可以完成的工作。

先写个setup.py,放在 docutils\tools 目录下(跟rst2html.py等放在同一目录):

实战py2exe 将docutils转换为EXE # setup.py
实战py2exe 将docutils转换为EXE

实战py2exe 将docutils转换为EXE
from  distutils.core  import  setup
实战py2exe 将docutils转换为EXE
实战py2exe 将docutils转换为EXE
import  py2exe
实战py2exe 将docutils转换为EXE
实战py2exe 将docutils转换为EXE setup(console
= [ " rst2html.py " " rst2xml.py " " rst2s5.py " " rstpep2html.py " " rst2latex.py " " rst2newlatex.py " ])

执行“python setup.py py2exe”后,在dist目录下确实生成了rst2html.exe, rst2xml.exe, ... 等文件,但却不能运行,提示“Import Error”,找不到module “standalone”!去它的官方网站找了半天才没发现对解决此问题有用的信息,它的文档太少太简单了。

那就研究一下吧,dist目录下的library.zip基本上不都是*.pyc文件吗,将该压缩包内的docutils子目录跟docutils解压后的目录对比一下,发现目录结构是一致的,文件名称也大致一致(*.pyc vs *.py),前者确实没有standalone.pyc文件。我于是根据提示将standalone.py文件放到library.zip相应的子目录下,再运行rst2html.exe,咦,管用,不再提示找不到模块standalone了,又提示找不到其它的模块了。我如法炮制,又加了几个*.py进去。后来不耐烦了,直接将library.zip中的docutils目录删除,将docutils解压后的同名目录放进去;另外又将extras目录也放进去(py2exe生成的library.zip中没有extras目录,因而导致运行时找不到roman模块)。很好,“找不到module”的错误终于完全解决了。

但是事情并没有结束。又报错:

IOError: [Errno 2] No such file or directory: 'library.zip/docutils/writers/html4css1/html4css1.css'

搜索一下源代码,发现只有一处代码(docutils\writers\html4css1\__init__.py)使用了该文件:

实战py2exe 将docutils转换为EXE class  Writer(writers.Writer):
实战py2exe 将docutils转换为EXE     ......
实战py2exe 将docutils转换为EXE     default_stylesheet 
=   ' html4css1.css '
实战py2exe 将docutils转换为EXE     default_stylesheet_path 
=  utils.relative_path(
实战py2exe 将docutils转换为EXE         os.path.join(os.getcwd(), 
' dummy ' ),
实战py2exe 将docutils转换为EXE         os.path.join(os.path.dirname(
__file__ ), default_stylesheet))
实战py2exe 将docutils转换为EXE     ......

它是按 "html4css1.css" 的绝对路径来访问的,可能是因为该文件在压缩文件library.zip中,因而访问不到。大概py2exe并没有将library.zip解压到磁盘,而是从内存中加载*.pyc/py的吧。

我的解决方案是,将library.zip解压出来,将library.zip删除,然后将庄解压后的目录名称修改为“library.zip”。
(事后想想,在setup.py文件中将“html4css1.css”指定为数据文件也应该可以解决此问题吧?)

问题终于解决了。目标达到了。哈哈。

py2exe只是一个小工具,暂时没有必要对它研究太深,能解决问题就行了,要求不高:)

 

你可能感兴趣的:(util)