Unity命令行模式,也能「日志实时输出」
如果你使用过Unity命令行模式(batchmode),来实现Unity自动化编译构建,你肯定会遇到过这样的问题:
Unity的命令行模式,它只提供了一个
-logfile参数,用于把日志输出到日志文件,但却没有提供实时的日志输出功能。
在这种情况下,我们执行Unity命令行程序,只知道了,Unity正在工作,但是,工作到什么进度,从它的Unity命令行程序的进程控制台日志,是看不出来的。
对于我,折衷的办法,会在自动化的编译脚本里,在Unity命令行执行完毕以后,手动的使用文件打印命令(cat),把日志给打印出来。类似这样...
# 执行Unity
/Applications/Unity/Unity.app/Contents/MacOS/Unity -batchmode -projectPath ~/UnityProjectPath -nographics -executeMethod GameEditor.BuildApp -logFile ~/UnityProjectPath/__kellylog.txt
# 打印最终输出的日志
cat ~/UnityProjectPath/__kellylog.txt
要想在Unity命令行模式工作的时候,查看它的编译进度,霖哥一般会远程跑进执行编译工作的机器,然后用tail -f命令,把它的日志实时输出来...
tail -F ~/UnityProjectPath/__kellylog.txt
嗯,这相当的不科学啊。
那有没有更好的方法?可以实时地,在执行Unity命令行后台程序的同时,进行日志输出?
Python多线程
就像我们前面所说的:Unity命令行模式,日志输出到文件中;同时,我平时使用tail -f命令,进行日志查看;
所以解决方法,很简单,遵循这个思路,做一个小脚本:
这个脚本,调用Unity命令行模式执行,同时,实现类似tail命令的功能,实时打印日志
脚本语言的选择,想要轻便、支持多线程、跨平台,Python自然是最佳的选择了。用Python的subprocess子进程模块,就能轻松实现这样的功能。
首先,使用subprocess调用Unity进程,并且实时输出进程控制台标准输出的日志。
# 执行命令,子进程,并把进程控制台日志,实时输出
import subprocess
cmd = """
/Applications/Unity/Unity.app/Contents/MacOS/Unity -batchmode -projectPath ~/UnityProjectPath -nographics -executeMethod GameEditor.BuildApp -logFile ~/UnityProjectPath/__kellylog.txt
"""
process = subprocess.Popen(
cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=project_path
)
while True:
out = process.stdout.read(1)
if out == '' and process.poll() != None:
break
if out != '':
sys.stdout.write("[Unity process console output]: " + out)
sys.stdout.flush()
然后,发起一个线程,使用python-tail模块,实时把日志文件,进行抓取输出。
import thread, tail
def tail_thread(tail_file):
t = tail.Tail(tail_file)
t.register_callback(unity_log_tail)
t.follow(s=1)
thread.start_new_thread(tail_thread, ('~/UnityProjectPath/__kellylog.txt', ))
你看,其实很简单的脚本,动动脑、动动手,就能实现达到目的,就一个子进程,加一个线程嘛。
源码
上面的只是不完整的一小段脚本技巧,完整的代码可以直接使用,开源在GitHub:
unity_realtime_log | https://github.com/mr-kelly/unity_realtime_log
你可以跨平台使用这个脚本,制定Unity的路径(-unity),工程路径(-project),和需要执行的C#方法(-method)。
Windows:
unity_realtime_log.bat -unity C:\Unity\Unity.exe -project C:\UnityProjectPath -method GameEditor.BuildMethod
Mac:
unity_realtime_log.sh -unity /Applications/Unity/Unity.app/Contents/MacOS/Unity -project ~/UnityProjectPath -method GameEditor.BuildMethod
或者直接执行Python:
python unity_realtime_log.py -unity C:\Unity\Unity.exe -project C:\UnityProjectPath -method GameEditor.BuildMethod
这样简单的Python脚本,却能够支持跨平台,相比使用make / Ant / NAnt等常见的编译工具,撸那些领域特定语言(如XML),会来得更加的灵活可靠。我个人,也推荐使用Python脚本,作为主力的任务自动化管理工具。
以上,希望对你有帮助。
我是霖哥,一个商学院毕业的程序员,一个Unity3D游戏开发工程师。
如果觉得有用请点赞,转载请注明出处。
如果在了解或学习编程的过程中有迷惘、或对一些生涩的科技概念的不解,评论里留下你的疑惑!
Unity命令行模式,也能「日志实时输出」的更多相关文章
- WinRAR的命令行模式用法介绍
因工作中要对数据打包,顺便研究了下WinRAR的命令行模式,自己写了些例子,基本用法如下: 测试压缩文件准备:文件夹test_data,内部包含子文件夹,分别存放了一些*.log和*.txt文件. 测 ...
- [转载] ubuntu开机直接进入命令行模式
最近安装了ubuntu12.04来使用,每次都进入unity界面再进入命令行很不方便. 不需要界面的话,可以通过设置来开机进入命令行模式. 今天提供两中比较好的方法.经本人测试两中方法都可使用. [1 ...
- Linux服务器命令行模式安装Matlab2014a
Linux服务器命令行模式安装Matlab2014a,有需要的朋友可以参考下. 0.下载安装包 下载Matlab2014a for Linux安装包的ISO镜像文件(感谢万能的度娘)以及破解包(下载地 ...
- jmeter命令行模式运行,实时获取压测结果
jmeter命令行模式运行,实时获取压测结果 jmeter很小,很快,使用方便,可以在界面运行,可以命令行运行.简单介绍下命令行运行的方式: sh jmeter.sh -n -t my-script. ...
- mysq在命令行模式下执行shell命令
mysql可以在命令行模式下执行shell命令 mysql> help For information about MySQL products and services, visit: htt ...
- PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)
源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkP ...
- Jmeter使用非 GUI 模式,即命令行模式运行实例讲
转载:http://www.cnblogs.com/leeboke/p/5238269.html 参考资料:https://girliemangalo.wordpress.com/2009/10/29 ...
- 命令行模式运行jmeter,主从方式运行jmeter
jmeter很小,很快,使用方便,可以在界面运行,可以命令行运行.简单介绍下命令行运行的方式: sh jmeter.sh -n -t my-script.jmx -R 10.6.5.31,10.6.5 ...
- [转载]Ubuntu如何切换到命令行模式
来源:https://blog.csdn.net/lyy14011305/article/details/76325067 Ubuntu提供两种进入方式,一个是我们平常最熟悉的图形界面形式,还有一种是 ...
随机推荐
- 590. N叉树的后序遍历
给定一个 N 叉树,返回其节点值的后序遍历. 例如,给定一个 3叉树 : 返回其后序遍历: [5,6,3,2,4,1]. 说明: 递归法很简单,你可以使用迭代法完成此题吗? /* // Definit ...
- 洛谷P1120 小木棍 [搜索]
题目传送门 题目描述乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍 ...
- 读书笔记(高性能javascript)(一)
1.加载与执行: (1)将脚本放在底部:(否则会阻塞) (2)由于每个<script>标签初始下载时都会阻塞页面渲染,所以减少页面包含的<script>标签数量有助于改善这一情 ...
- 北大青鸟代码---asp.net初学者宝典
一.上传图片:使用控件:file,button,image; 上传按钮的代码: string fullfilename=this.File1 .PostedFile .FileName ;取得本地文件 ...
- 【HDU 5730】Shell Necklace
http://acm.hdu.edu.cn/showproblem.php?pid=5730 分治FFT模板. DP:\(f(i)=\sum\limits_{j=0}^{i-1}f(j)\times ...
- BZOJ 1040:[ZJOI2008]骑士(环套外向树+树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1040 [题目大意] 给出环套外向树森林,求最大权独立集. [题解] 我们对于每个连通块 ...
- [CODECHEF]RIN
题意:一个人要在$m$个学期上$n$节课,在第$j$学期上$i$课有$X_{i,j}$的收益,有些课$B_i$有前置课程$A_i$,问最大得分 这个题我都做不出来还去看题解...我退役吧== 考虑每种 ...
- 【贪心】【set】zoj3963 Heap Partition
贪心地从前往后扫,每到一个元素,就查看之前的元素中小于等于其的最大的元素是否存在,如果存在,就将它置为其父亲.如果一个结点已经是两个儿子的父亲了,就不能在set中存在了,就将他删除.如果然后将当前元素 ...
- Mysql客户端下载地址
官网:http://dev.mysql.com/downloads/mysql/ 上述千万不要下载免安装版本. 千万记住一定要下载MSI安装版本.
- java比较客户端版本号
参考文章:http://www.jb51.net/article/70317.htm 关键点 为什么不能使用String.compareTo方法来比较客户端版本号? 举个例子,之前客户端版本号为:9. ...