最近想把一個(gè)寫的幾百行的腳本封裝成一個(gè)App荒澡,方便使用报辱,于是進(jìn)行了一番探索,在這里記錄一下单山!
方案選擇
首先是搜索有哪幾種解決方案碍现,哪個(gè)是最好的呢。搜索下來(lái)發(fā)現(xiàn)饥侵,有這么幾種:
將Shiny APP搭建為獨(dú)立的桌面可執(zhí)行程序
我覺(jué)得Shiny更適合網(wǎng)站布署呢鸵赫,另外就是需要改寫的內(nèi)容太多,因?yàn)殚_(kāi)始是R腳本躏升,需要重新改寫成Shiny App的代碼辩棒。用的是R-Protable,然后還需要node.js封裝,又是一個(gè)勸退的坑呢一睁,這個(gè)不是太熟悉钻弄,還要配置環(huán)境變量,好像便攜性就大打折扣了呢者吁。
python實(shí)現(xiàn)帶GUI界面的文件處理器原來(lái)這么簡(jiǎn)單窘俺,看完你也可以
另外發(fā)現(xiàn)的一個(gè)寶藏python模塊,最早知道這個(gè)是生信菜鳥(niǎo)團(tuán)的分享复凳,Gooey瘤泪,雖然知道python打包一個(gè)App體積是臃腫到無(wú)敵的,但是簡(jiǎn)單和文件體積大點(diǎn)來(lái)說(shuō)育八, 簡(jiǎn)單最重要了吧对途,幾百M(fèi)的空間大家不會(huì)太在乎吧,特別是現(xiàn)在手機(jī)App都這個(gè)體積的時(shí)代髓棋,于是選個(gè)了实檀。依然使用R-Protable,用R語(yǔ)言這是不可少的按声,不過(guò)如果腳本改寫成Python的膳犹,它應(yīng)該就可以省略了,這部分空間應(yīng)該也就能省下签则。
實(shí)現(xiàn)思路就是超級(jí)簡(jiǎn)單的os.system(cmd)
執(zhí)行我們的腳本了须床,以下是基本的實(shí)現(xiàn)過(guò)程:
GUI的實(shí)現(xiàn)
https://segmentfault.com/a/1190000040111317
這里的代碼和圖片部分來(lái)自上面的[參考博客](python-Gooey速成GUI程序 - SegmentFault 思否
)。
模塊安裝
pip install Gooey
GUI主程序
# -*- coding: utf-8 -*-
import os
from gooey import Gooey, GooeyParser
@Gooey(
richtext_controls=True,
language='chinese',
header_show_title=False,
program_name="處理工具v1.0",
encoding="utf-8",
default_size=(650, 555),
progress_expr="current / total * 100",
# 再次執(zhí)行怀愧,清除之前執(zhí)行的日志
clear_before_run = True,
timing_options = {'show_time_remaining':True,'hide_time_remaining_on_complete':False}
)
def main():
desc = "工具說(shuō)明:"+"\n"+" "+"1.本工具僅作為xxx使用"
file_help_msg = "help...info"
my_cool_parser = GooeyParser(description=desc)
my_cool_parser.add_argument(option_strings=['-u', '--username'],dest='賬號(hào)', widget="TextField")
my_cool_parser.add_argument(option_strings=['-p', '--password'],dest='密碼', widget="TextField")
my_cool_parser.add_argument(option_strings=['-v', '--verify_number'],dest='驗(yàn)證碼', widget="TextField")
my_cool_parser.add_argument(option_strings=['-f', '--file_path'], dest="待匹配文件路徑", widget="FileChooser")
# 獲取參數(shù)
args = my_cool_parser.parse_args()
print(args)
# 第一次用format的方法
cmd = '.\\App\\R-Portable\\bin\\Rscript.exe --no-save App_test.R {0} '.format(args)
print(cmd)
os.system(cmd)
# 原博客少了個(gè)主函數(shù)的調(diào)用侨颈,我加上了余赢,不過(guò)這個(gè)不夠標(biāo)準(zhǔn)芯义,標(biāo)準(zhǔn)應(yīng)該是__main__這樣的
main()
腳本的內(nèi)容以及運(yùn)行依賴
args<-commandArgs(T)
print(args)
報(bào)錯(cuò)的解決
運(yùn)行中出現(xiàn)了如下的錯(cuò)誤,最終解決方案是把這個(gè):
'utf-8' codec can't decode byte 0xb2 in position 13: invalid start byte
我的解決方案是上這個(gè)編碼方案是把有.decode(
的替換成.decode('ISO-8859-1')
妻柒,替換了兩處扛拨,就正常運(yùn)行啦!
打包成exe
# 首先安裝這個(gè)模塊
pip install pyinstaller
# 然后就可以愉快地打包exe了
pyinstaller.exe .\gui.py -i C:\Users\00\miniconda3\Lib\site-packages\gooey\images\icon.ico
收工举塔,可以交付啦绑警!
對(duì)啦,還有R-portable
R Portable download | SourceForge.net
下載安裝就可以啦央渣,不過(guò)好處是安不裝一次计盒,其余的可以復(fù)制分享就行啦,好奇作者為啥不直接提供zip呢芽丹!
https://sourceforge.net/projects/rportable/files/R-Portable/4.1.2/R-Portable_4.1.2.paf.exe/download