linux環(huán)境打包python工程為可執(zhí)行程序的過程
本次又個需求,在ubuntu上面開發(fā)的python代碼程序需要打包成一個可執(zhí)行程序然后交付給甲方,因為不能直接給源碼給甲方,所以尋找方法將python開發(fā)的源碼打包成一個可執(zhí)行程序,注意是打包成在ubuntu上面的可執(zhí)行程序,不是打包成在window上的可執(zhí)行程序,如果需要打包成windows上的可執(zhí)行程序請參照此博客,鏈接:windows下打包python源碼成可執(zhí)行文件
本次在ubuntu上打包python源碼的方法和在window上打包的有點類似,大概流程如下:
1、在ubuntu上安裝easy_install
#sudo apt-get install python-setuptools python-dev build-essential
2、下載并安裝pyinstaller
在網址下載pyisntaller的包,地址:http://www.pyinstaller.org/,下載對應的tar包
假設下載下來的包是:pyinstaller_2.1.tar.gz
然后使用命令解壓包:#tar -cf pyinstaller_2.1.tar.gz
進入解壓后的目錄:#cd pyinstaller_2.1
最后執(zhí)行命令安裝pyinstaller:#sudo python setup.py install
如果中間沒有報錯的話,pyinstaller就安裝完成了
3、打包python項目源碼
假如說你的python源碼的結構目錄如下:
total 16 drwxrwxr-x 2 jelly jelly 4096 Mar 14 15:13 config drwxrwxr-x 2 jelly jelly 4096 Mar 14 15:13 database -rw-rw-r-- 1 jelly jelly 2 Mar 14 15:13 main.py -rw-rw-r-- 1 jelly jelly 3 Mar 14 15:13 manager.py
圖中可以看到有兩個文件夾,兩個py源碼文件,mian.py是主函數文件
然后,我們使用命令打包源碼
#pyinstaller -F main.py
然后就會生成如下目錄
total 28 drwxrwxr-x 3 jelly jelly 4096 Mar 14 15:18 build drwxrwxr-x 2 jelly jelly 4096 Mar 14 15:13 config drwxrwxr-x 2 jelly jelly 4096 Mar 14 15:13 database drwxrwxr-x 2 jelly jelly 4096 Mar 14 15:18 dist -rw-rw-r-- 1 jelly jelly 2 Mar 14 15:13 main.py -rw-rw-r-- 1 jelly jelly 813 Mar 14 15:18 main.spec -rw-rw-r-- 1 jelly jelly 3 Mar 14 15:13 manager.py
圖中dist文件夾下面就是生成的可執(zhí)行文件,可以使用命令./main執(zhí)行生成的可執(zhí)行文件
但是此時你會發(fā)現有問題,因為這個打包的方法它只會打包當前目錄下的所有py文件,而不會打包config和database這兩個文件夾,所以此時的可執(zhí)行文件打包的并不完整,此時該怎么做呢,咱們接著來
4、重新打包
重新打包的的意思是需要修改那個main.spec文件,然后再使用這個文件進行打包,操作流程如下
打開main.spec文件,修改前如下內容
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['main.py'],
pathex=['/home/jelly/test'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )修改后的main.spec文件內容如下:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['main.py'],
pathex=['/home/jelly/test'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
dict_database = Tree('/home/jelly/test/database',prefix='database')
a.datas += dict_database
dict_config = Tree('/home/jelly/test/config',prefix='config')
a.datas += dict_config
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )可以看到,中間添加了添加兩個文件夾的絕對路徑,是和這個路徑相對應的
pathex=['/home/jelly/test'],
這個路徑是之前工具自己生成的,所以我們添加的兩個目錄的絕對路徑也和它保持一致,這個修改完成后久可以了
5、編譯生成
安裝第4步的修改完成后,再執(zhí)行命令
#pyinstaller mian.spec
即可,這樣打包的程序就包含了兩個依賴的文件夾了
其實最后感覺和在window上面打包生成window上的可執(zhí)行文件的流程差不多,工具也都是用的pyinstaller打包。
感謝感謝?。?!
相關文章
Python中Playwright?與?pyunit?結合使用詳解
這篇文章主要介紹了Python中Playwright?與?pyunit?結合使用,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
用pushplus+python監(jiān)控亞馬遜到貨動態(tài)推送微信
這篇文章主要介紹了用pushplus+python監(jiān)控亞馬遜到貨動態(tài)推送微信的示例,幫助大家利用python搶購商品,感興趣的朋友可以了解下2021-01-01

