原文來自:http://wiki.woodpecker.org.cn/moin/LeoJay/PyPackage
記錄下來以防以后找不到了。
Python沒有內建一個編譯為exe的功能。給python程序的部署帶來不少的麻煩。
所以就會出現一些py2exe之類的很不錯的工具,用于自動把.py文件編譯為.exe文件。
最近抽空研究了一下手動實現類似py2exe的功能,希望加強對python的了解。
結果還相當不錯。把結果記錄下來,與大家共享。
原理
文中所描述的方法,基于python的以下幾個功能
1. python程序運行時,會在sys.path指定的路徑中查找庫文件。
2. python從2.3開始,支持從zip文件中import庫(支持.py,.pyc和.pyo,但不支持.pyd)
3. python提供C API,讓c語言的程序,可以很方便的調用python的程序
實際步驟
注:假設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中。

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

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就可以了。
有不少人寫email給我,問我要我做的包。大家可以在這里下載基于2.5.2版本的包: python_dist.7z 以及基于3.1.2版本的包: python31-dist.7z
注:3.1.2依賴于visual c++ 2008 redistributable package. 如果在目標機器上沒有安裝,則程序運行不起來。
解開包后,只要用自己的程序替換mysrc.zip就可以使用了。
包里有runpy.exe和runpyw.exe兩個文件。其中,runpy.exe是控制臺程序,runpyw.exe是非控制臺程序。這兩個程序分別類似于python.exe和pythonw.exe。想讓程序運行時出現一個控制臺,就運行runpy.exe,如果不想出現黑黑的控制臺,就運行runpyw.exe。