最近想把一个写的几百行的脚本封装成一个App,方便使用,于是进行了一番探索,在这里记录一下!
首先是搜索有哪几种解决方案,哪个是最好的呢。搜索下来发现,有这么几种:
我觉得Shiny更适合网站布署呢,另外就是需要改写的内容太多,因为开始是R脚本,需要重新改写成Shiny App的代码。用的是R-Protable,然后还需要node.js封装,又是一个劝退的坑呢,这个不是太熟悉,还要配置环境变量,好像便携性就大打折扣了呢。
另外发现的一个宝藏python模块,最早知道这个是生信菜鸟团的分享,Gooey,虽然知道python打包一个App体积是臃肿到无敌的,但是简单和文件体积大点来说, 简单最重要了吧,几百M的空间大家不会太在乎吧,特别是现在手机App都这个体积的时代,于是选个了。依然使用R-Protable,用R语言这是不可少的,不过如果脚本改写成Python的,它应该就可以省略了,这部分空间应该也就能省下。
实现思路就是超级简单的os.system(cmd) 执行我们的脚本了,以下是基本的实现过程:
https://segmentfault.com/a/1190000040111317
这里的代码和图片部分来自上面的[参考博客](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",
# 再次执行,清除之前执行的日志
clear_before_run = True,
timing_options = {'show_time_remaining':True,'hide_time_remaining_on_complete':False}
)
def main():
desc = "工具说明:"+"\n"+" "+"1.本工具仅作为xxx使用"
file_help_msg = "help...info"
my_cool_parser = GooeyParser(description=desc)
my_cool_parser.add_argument(option_strings=['-u', '--username'],dest='账号', 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='验证码', widget="TextField")
my_cool_parser.add_argument(option_strings=['-f', '--file_path'], dest="待匹配文件路径", widget="FileChooser")
# 获取参数
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)
# 原博客少了个主函数的调用,我加上了,不过这个不够标准,标准应该是__main__这样的
main()

args<-commandArgs(T)
print(args)
报错的解决
运行中出现了如下的错误,最终解决方案是把这个:
'utf-8' codec can't decode byte 0xb2 in position 13: invalid start byte
我的解决方案是上这个编码方案是把有.decode(的替换成.decode('ISO-8859-1'),替换了两处,就正常运行啦!

# 首先安装这个模块
pip install pyinstaller
# 然后就可以愉快地打包exe了
pyinstaller.exe .\gui.py -i C:\Users\00\miniconda3\Lib\site-packages\gooey\images\icon.ico
收工,可以交付啦!
R Portable download | SourceForge.net
下载安装就可以啦,不过好处是安不装一次,其余的可以复制分享就行啦,好奇作者为啥不直接提供zip呢!
https://sourceforge.net/projects/rportable/files/R-Portable/4.1.2/R-Portable_4.1.2.paf.exe/download
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否