Ubuntu20.04 pycharm python打包制作DEB包详细步骤及雷区
記錄一次Deb打包過(guò)程及踩雷警示
最近寫了一個(gè)python的小程序,希望能打包成deb文件,便于將寫好的軟件安裝 在其他沒(méi)有安裝工作環(huán)境的電腦上,把這安裝deb后可以在應(yīng)用列表和桌面看到。下面介紹一個(gè)python工程的打包過(guò)程, 分為兩大步驟:
1、將工程打包生成一個(gè)可執(zhí)行文件;
2、將可執(zhí)行文件和工程依賴的所有文件制作成.deb安裝包。
需要準(zhǔn)備的
1、源代碼(前提要可執(zhí)行)或者編譯好的程序,這里只介紹python
2、能用的ubuntu系統(tǒng)
3、用戶的密碼
4、圖標(biāo)(一定要有!)
這里給大家介紹一個(gè)案例,包名叫做debpacktest,整個(gè)過(guò)程中所有用到名字的地方,統(tǒng)統(tǒng)都是這個(gè)名字。xxx也指代這個(gè)名字。
一、 將工程打包生成一個(gè)可執(zhí)行文件
1.在pycharm中安裝pyinstaller
2.在工作代碼區(qū),鼠標(biāo)右鍵調(diào)出terminal終端,輸入命令pyinstaller -F -w main.py 點(diǎn)擊回車,會(huì)看到成功提示(main.py 是主文件名)
備注:
pyinstaller -F main.py 打包ubuntu下的可執(zhí)行文件 pyinstaller -F -w main.py 不帶控制臺(tái)的打包 pyinstaller -F -w -i Aplication.ico main.py 打包指定ubuntu下的可執(zhí)行文件的圖標(biāo)打包3.將工程里面除了.py文件(作用:保留源碼)外的所有依賴文件(如數(shù)據(jù)文件)按原來(lái)在工程中的目錄 拷貝到當(dāng)前目錄的/test/dist/test下,在其他工作目錄下運(yùn)行可執(zhí)行文件(如/usr/test(絕對(duì)路徑)),看是否可以執(zhí)行,若不能運(yùn)行,可能是以下原因:
(1)、路徑中有漢字;
(2)、你的python程序中有路徑不會(huì)隨文件目錄變化而變化;
(3)、依賴文件沒(méi)有拷貝或拷貝不完整。
二、將可執(zhí)行文件和工程依賴的所有文件制作成.deb安裝包。
1.建立目錄架構(gòu)
程序是要放到一個(gè)系統(tǒng)中的各個(gè)部分去的。其實(shí)這個(gè)并沒(méi)有那么嚴(yán)格,不一定全都要擠到/usr/lib里邊去,放到/home等都沒(méi)有太大的問(wèn)題。這里你需要用一個(gè)文件夾模擬出linux的文件架構(gòu),只需要模擬你程序需要安放到的位置就行了。比如說(shuō)我有可執(zhí)行文件和工程依賴的所有文件,放到的文件夾是/usr/lib/debpacktest。那么我只需要建一個(gè)大文件夾(命名隨意),cd到這個(gè)大文件夾,直接一個(gè)mkdir新建/usr /lib /debpacktest,然后把可執(zhí)行文件和工程依賴的所有文件丟進(jìn)debpacktest文件夾。下面羅列出來(lái)的是目錄結(jié)構(gòu),多余出來(lái)的是需要手工添加的deb包配置文件(夾)。(share部分和DEBIAN部分)
├── debpackTotal │ ├── DEBIAN(這個(gè)目錄要添加control文件(無(wú)后綴名),可選添加postinst等) │ └── usr │ ├── lib │ │ └── debpacktest(預(yù)定要安裝到系統(tǒng)中的可執(zhí)行文件和工程依賴的所有文件) │ │ └── main等 │ └── share │ ├── applications(在這里添加xxx.desktop,使應(yīng)用中能夠加載出你的應(yīng)用) │ └── icons(你的圖標(biāo),這個(gè)必須有) **踩雷一**在DEBIAN目錄下制作control文件
cd到DEBIAN,在命令行輸入(當(dāng)然,你用gedit也行)
vim control在其中粘貼:
Package: debpacktest Version: 1.0.0 Architecture: amd64 Maintainer: gao Description: just a testPackage:你的包名
Version:版本
Architecture:架構(gòu)
Maintainer:維護(hù)者
Description:解釋
括號(hào)后的內(nèi)容 根據(jù)你自己的需要去改變
然后保存
2.在/usr/share/applications下制作桌面圖標(biāo) debpacktest.desktop
這一步非常重要 關(guān)系到你能否在應(yīng)用列表出現(xiàn)你自己的程序,清一定按照下面的步驟完成。
首先在/usr/share/applications/下新建debpacktest.desktop這個(gè)文件。
里面的內(nèi)容是:
Name:你的包名
Comment:評(píng)論 注釋
Exec:這里非常重要!這里如果不對(duì) 會(huì)直接導(dǎo)致這個(gè)圖標(biāo)沒(méi)有辦法顯示。對(duì)于python來(lái)說(shuō),一定要具體到執(zhí)行哪個(gè)可執(zhí)行文件。這里執(zhí)行的是main。不要忘記chmod +x 文件名,給main加上可執(zhí)行權(quán)限(用pyinstaller打包生成都有可執(zhí)行權(quán)限)。踩雷二
Icon:圖標(biāo),不可以忽略 踩雷三
Terminal:是否在終端執(zhí)行。這里是QtPy窗體,不需要。如果需要的話可以參考vim的desktop文件 踩雷四
X-Ubuntu-Touch這個(gè)暫時(shí)我也不知道是什么用的
Categories:分類。Categories可以取以下值,表示程序的啟動(dòng)快捷方式放在哪個(gè)菜單下:應(yīng)用菜Application; Network放在 互聯(lián)網(wǎng) (Internet);辦公 Office;圖形 Graphics;聲音和視AudioVideo; 系統(tǒng)工具 System;編程 Development; 附件Utility;影音 AudioVideo;游戲 Game;首 選項(xiàng) Settings(GNOME;GTK;Settings;HardwareSettings;); 系統(tǒng)管理System。
剩下的東西 都不要?jiǎng)?都不要?jiǎng)?br /> 文件不能有多余的空格! 踩雷五
desktop文件要有可執(zhí)行權(quán)限!
為一個(gè)文件添加可執(zhí)行權(quán)限
3.打包
到這里,一個(gè)基本的deb軟件包就大功告成了。
我們返回到debpackTotal的上級(jí)目錄。我們執(zhí)行
包的命名要符合規(guī)范,我這里是隨便打的。
檢驗(yàn)的話,可以輸入(安裝deb包)
在我的ubuntu機(jī)器上,運(yùn)行很完美,我在應(yīng)用列表里看到了我的程序。
如果要卸載,請(qǐng)執(zhí)行
注意 這里面的參數(shù) 是包名,并非包的文件名,就是一開(kāi)始我讓你們注意的那個(gè)全局命名。
關(guān)于postinst文件(即制作桌面圖標(biāo))
cd到DEBIAN目錄,新建postinst文件,沒(méi)有后綴。這個(gè)文件是在安裝完包以后執(zhí)行的腳本
復(fù)制以下內(nèi)容:
這里是在包安裝完成后,執(zhí)行代碼,將desktop文件復(fù)制到桌面。不同語(yǔ)言的發(fā)行版需要注意桌面的路徑。踩雷六
postinst要有可執(zhí)行權(quán)限。踩雷七
重新打包,安裝,檢驗(yàn),發(fā)現(xiàn)桌面上多了個(gè)東東,是我們復(fù)制過(guò)去的文件,但并沒(méi)有顯示圖標(biāo)。
我們需要右擊它,選擇允許執(zhí)行。你想要的結(jié)果便出現(xiàn)了。
總結(jié):
以上就是簡(jiǎn)單制作一個(gè)基本的deb文件的全部步驟以及部分?jǐn)U展。需要耐心。Enjoy it.
GLIBC問(wèn)題:
這兩天我在本公司服務(wù)器上(Linux)打包Python代碼,然后拷貝到我自己的虛擬機(jī)上就無(wú)法執(zhí)行,報(bào)錯(cuò)內(nèi)容如下:
[3513] Error loading Python lib ‘/tmp/_MEIwj9Y1X/libpython3.6m.so.1.0’: dlopen: /lib64/libc.so.6: version `GLIBC_2.25’ not found (required by /tmp/_MEIwj9Y1X/libpython3.6m.so.1.0)
大體意思是:libpython3.6m.so.1.0這個(gè)依賴庫(kù)需要依賴2.25版本或者以上的GLIBC。于是我在命令終端
ldd --version查了一下我自己虛擬機(jī)的GLIBC和公司服務(wù)器上的GLIBC 發(fā)現(xiàn)我自己的虛擬機(jī)上是2.17版本,公司服務(wù)器上是2.27版本 于是原因就明白了
原因是:打包時(shí)的GLIBC是高版本,因此打包出來(lái)的可執(zhí)行文件所依賴的也是高版本,所以在GLIBC低版本的 Linux系統(tǒng)中就無(wú)法執(zhí)行
我的解決方法:在低版本GLIBC的系統(tǒng)上打包好,這樣就都可以運(yùn)行了
參考&引用:
https://my.oschina.net/u/4323266/blog/4537886
https://blog.csdn.net/yangjian131/article/details/78078853
https://blog.csdn.net/wangziyang777/article/details/107365606
總結(jié)
以上是生活随笔為你收集整理的Ubuntu20.04 pycharm python打包制作DEB包详细步骤及雷区的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux内核2.6.35编译过程
- 下一篇: python中使用cv2.findCon