1. 程式人生 > >python軟體釋出(本地環境釋出到伺服器)

python軟體釋出(本地環境釋出到伺服器)

 

 

 


 

  • Windows 平臺
  • Python 2.7.9(Python 2最新版)

 

py2exe 是最好的選擇。

 

1. 安裝py2exe

 

可直接到這裡下載

py2exe - Browse /py2exe/0.6.9 at SourceForge.net

應選擇Python對應的版本。例如我們的Python是32位的2.7.9,則下載

py2exe-0.6.9.win32-py2.7.exe

如果你安裝的Python是64位的,則下載

py2exe-0.6.9.win64-py2.7.amd64.exe

 

檢視Python是32位還是64位,只需到命令提示符下執行:

python -c "import sys;print '%x' % sys.maxint"

32位的Python會輸出7fffffff,64位的Python會輸出7fffffffffffffff

注意我們關注的是Python的版本而不是Windows的版本。

 

一般說來,處於相容性的考慮,應該安裝32位的Python,否則編譯好的程式將無法在32位的Windows下執行。

 

2 準備你的Python程式

 

需要確保你的Python程式能夠正常執行。

例如我們的程式叫hello.py,裡面的內容就一句話:

print 'Hello,Python'

 

3 準備setup.py

 

你需要告訴py2exe轉換時所需要的設定。

在同一個目錄下新建一個檔案,比如叫build.py,寫入以下程式碼:

from distutils.core import setup
import py2exe

setup( console=['hello.py'],
       zipfile = None,
       options = {'py2exe' : { 
                     "bundle_files": 1,
                     "dll_excludes": ["MSVCP90.dll","w9xpopen.exe"]
                     }
                  }
 )

 

build.py 包含了許多設定。包括你自己的Python程式的檔名,是否建立獨立的應用程式等。如果想把這個build.py用到其他Python程式,只需要修改console=['hello.py'],中的'hello.py'即可。

 

4 生成可執行檔案

 

在命令列下執行:

python build.py py2exe

螢幕會輸出大量的資訊。如果工作正常,會以以下資訊結束:

 

當前目錄下會產生兩個目錄,dist和build。目錄build含有轉換時所需要的臨時檔案;dist含有最終轉換的結果。

 

 

可以把dist目錄下的hello.exe拷給別人了,它不需要對方的電腦上安裝Python。

 

5 一點兒背景知識

 

僅僅是輸出'Hello Python',最終得到的hello.exe卻有5M之巨。py2exe 的原理,簡單的說就是把一個迷你的Python和你的程式捆綁在了一起。在其他計算機上執行時,就相當於先快速‘安裝’了一個Python,只不過對方感覺不到而已。

 

===================== 更新 =====================

 

6 關於Python3

 

py2exe 專案對於Python2和Python3釋出了互不相容的安裝包。

對於Python3,通過easy_install或者pip線上安裝py2exe即可,或者到下面的網址下載安裝包。

https://pypi.python.org/pypi/py2exe/

 

對於Python3的py2exe,除了與Python2相同的build.py的方式,還有一種簡單直接的方法,適用於不需要額外配置的情況。例如你的Python程式叫做hello.py,在命令列輸入

 

<Python3-Install-Path>\Scripts\build_exe hello.py -b 0 -c

其中,<Python3-Install-Path>指你Python3的安裝目錄,選項-b 0含義為“建立單一可執行檔案”,-c的含義是“對可執行檔案進行壓縮”

 

此時會在dist/目錄下出現hello.exe。是不是很方便?

 

===================== 更新 =====================

 

6 關於GUI應用程式的編譯封裝

6.1 wxPython
不需要額外的處理。
如果不願意彈出console視窗的話,可在build.py裡將“console=['hello.py']”改成“windows=['hello.py']”,即
 

from distutils.core import setup
import py2exe

setup( windows=['hello.py'],
       zipfile = None,
       options = {'py2exe' : {
                     "bundle_files": 1,
                     "dll_excludes": ["MSVCP90.dll","w9xpopen.exe"]
                     }
                  }
 )

6.2 PyQt4
build.py 需要增加sip。另外,鑑於檔案較大,最好進行壓縮。示例build.py:

from distutils.core import setup
import py2exe

setup( windows=['hello.py'],
       zipfile = None,
       options = {'py2exe' : { 
                     "bundle_files": 1,
                     "dll_excludes": ["MSVCP90.dll","w9xpopen.exe"],
                     "includes": ["sip"],
                     "compressed": 1,
                     "optimize": 2,                     
                     }
                  }
 )

鑑於py2exe是使用掃描import的方法自動決定打包的檔案,因此,下面的程式碼,雖然以指令碼方式可以執行,但是編譯後會產生QtCore無法找到的錯誤:
 

#!/usr/bin/python

from PyQt4.QtGui import *

if __name__ == '__main__':
    app = QApplication([])
    w = QWidget()
    w.show()
    app.exec_()

正確的做法是按照Qt本身的依賴,寫完所有所依賴的module:

#!/usr/bin/python

from PyQt4.QtCore import *
from PyQt4.QtGui import *

if __name__ == '__main__':
    app = QApplication([])
    w = QWidget()
    w.show()
    app.exec_()