青未了分享 http://blog.sciencenet.cn/u/yanghang

博文

IDL程序发布与部署

已有 3197 次阅读 2019-2-3 20:53 |个人分类:IDL学习笔记|系统分类:科研笔记

程序编译、运行、测试通过后需要进行程序发布和部署,以便于程序的进一步应用。IDL程序发布分为sav发布和exe发布两种,部署分为虚拟机(Virtual Machine)和运行时(Runtime)两种。

一、程序发布

1.sav发布

Sav文件是IDL特有的文件类型,能够将程序、函数、对象或数据保存到其中,方便共享程序或者数据。Sav文件中包含程序时可以通过虚拟机调用执行。

1.1使用SAVE命令完成,生成Sav文件

Syntax

SAVE [, Var1, ..., Varn] [, /ALL] [, /COMM, /VARIABLES] [, /COMPRESS] [, DESCRIPTION=string] [, /EMBEDDED] [, FILENAME=string] [, /IGNORE_NOSAVE] [, /ROUTINES] [, /SYSTEM_VARIABLES] [, /VERBOSE]

对于单个或少量源码文件,使用SAVE命令较为方便。以helloworld.pro为例,使用如下命令编译SAV文件,编译后的SAV文件可双击运行。

IDL> .RESET_SESSION   ;重置IDL进程,或点击工具栏按钮重置IDL

IDL> .COMPILE HELLOWORLD.PRO

% Compiled module: HELLOWORLD.

IDL> SAVE, 'HELLOWORLD', FILENAME = 'D:\TEMP\HELLOWORLD.SAV', /ROUTINES

注:生成的SAV文件名必须与主过程名一致,否则无法运行。

(1)变量

save命令支撑将变量保存到sav文件中,变量保存与使用示例代码如下:

data=fltarr(600,600)

save,/VARIABLES,filename='var.sav'

.reset_session

restore,'var.sav'

(2)Pro程序

  • 纯IDL程序发布

纯IDL程序是指未调用ENVI的IDL程序。一个或多个pro文件发布为sav文件的方式参考如下:

help,/PROCEDURES 

.compile -v 'D:\IDLPROJ\test\helloworld.pro'

help,/PROCEDURES

 save,'helloworld',filename='D:\IDLPROJ\test\helloworld.sav',/routines

 .reset_session

help,/PROCEDURES

restore,filename='D:\IDLPROJ\test\helloworld.sav'

help,/PROCEDURES

HELLOWORLD

核心步骤:编译,save,restore,运行

如果程序中对其他pro程序或函数进行了使用,未对引用程序进行编译可以调用resolve_all命令。该命令可以编译程序中调用到的函数源码。

  • ENVI二次开发程序发布

二次开发程序是指ENVI二次开发模式下编写的代码。发布为sav文件的操作步骤如下:

首先,确保代码编译和运行正常;

其次,重置idl编译器,单击工具栏‘重置’按钮或在命令行中输入‘ .reset_session’;

第三,编译代码,单击工具栏‘编译’按钮进行编译或在命令行中使用‘resolve_all’,即resolve_all,  /CONTINUE_ON_ERROR, SKIP_ROUTINES='ENVI';

第四,在命令行中输入sav保存命令,即save,'程序名',filename='文件名',/routines。此时sav文件大小为3kb,双击或通过idl虚拟机能够正确调用运行。若代码经过编译和运行,再在命令行中输入sav保存命令,此时双击或通过idl虚拟机调用sav文件不能正常运行,会自动启动envi程序。

注意事项:

在pro程序第一行写上

  1. pro第一行写上compile_opt idl2或COMPILE_OPT STRICTARR,避免编译时ENVI函数找不到的情形;

  2. 调试时需要终止程序,尽量不要点击“终止”按钮(Ctrl+F2),点击编译即可;

  3. 如已经点击了“终止”按钮或快捷键(ctrl+F2),再次运行程序前需要重置IDL进程,即命令行输入.reset_session或.full_reset_session;

  4. 菜单“窗口”-“首选项”-“IDL”-“路径”下要确保存在<IDL_default>,尽量不要添加其他路径;

  5. ENVI的菜单File-Perference下,Miscellaneous面板下,将Exit IDL on Exit from ENVI修改为No,避免envi_Batch_Exit执行时IDL退出;

  6. 确保是在idl编译器进行了‘重置’且仅对源码和引用函数进行编译之后来使用save,命令生成的文件。

附参考模版: 

pro test_envi_Batch
  compile_opt IDL2
  envi,/restore_base_save_files
  envi_Batch_init
 
  envi_open_file,envi_pickfile(),r_fid=fid
  tmp = dialog_Message('file ID:'+StrTrim(fid,2),/Infor)

  envi_Batch_exit
end

Syntax

RESOLVE_ALL [, CLASS=string] [, /CONTINUE_ON_ERROR] [, /QUIET] [, RESOLVE_EITHER=string] [, RESOLVE_FUNCTION=string] [, RESOLVE_PROCEDURE=string] [, SKIP_ROUTINES=string] [, UNRESOLVED=variable]


  • 工程项目模式

工程项目模式是用来组织、管理idl源码文件及资源文件的代码的管理方式。

工程通过构建工程和运行工程进行工程项目的编译和运行,构建工程时可以自动生成sav文件。

IDL工程项目:

单击【项目】-【属性】或在工程上右键菜单中选择【属性】弹出的工程属性界面中设置参数。单击idl工程属性,可在文本框‘newproject’中修改主函数名称。

11.png


在构建工程时是否穿件sav文件及sav文件名称,可以在右击弹出的菜单中选择【idl工程属性】-【工程构建属性】中勾选选项【创建sav文件】进行设置。然后右击工程列表,选择弹出菜单中的‘构建工程’即可。

22.png

工程项目中的某些文件如果不需要发布,可在上图中选择【工程编译顺序配置】,然后将不需要发布的文件勾掉(避免工程中某些不完整的程序影响发布):

44.bmp

ENVI二次开发工程项目:

需要在工程构建属性中选择‘构建工程前执行.reset_session’,且不选‘执行resolve_all’(作者测试了下,好像需要选择resolve_all选项,不选择运行报错。)

1.2运行sav文件

从上面的讲解中可知,生成sav文件后,可以利用restore加载sav文件,加载后文件中的数据、变量和程序均加载到当前idl编译器进程中直接使用。

(1)IDL_save_file对象。查询sav文件格式,可以通过对象类‘IDL_SaveFile’来实现,示例代码如下:

; Select a SAVE file to restore. The file contains volume data.
savefile = FILEPATH('cduskcD1400.sav', $
   SUBDIRECTORY=['examples', 'data'])
 
; Create a savefile object.
sObj = OBJ_NEW('IDL_Savefile', savefile)
 
; Query the contents of the SAVE file to determine the number of
; regular variables contained therein.
sContents = sObj->Contents()
PRINT, sContents.N_VAR
 
; IDL Prints:
; 3
 
; Retrieve the names of the variables in the SAVE file.
sNames = sObj->Names()
PRINT, sNames
 
; IDL Prints:
; DENSITY MASSFLUX VELOCITY
 
; Determine the size of the DENSITY variable.
sDensitySize = sObj->Size('density')
PRINT, sDensitySize
 
; IDL Prints:
; 3          30          30          15           1       13500
 
; Restore the DENSITY variable.
sObj->Restore, 'density'
 
; Display the volume data.
IVOLUME, density

上述代码引自:http://www.harrisgeospatial.com/docs/IDL_Savefile.html

(2)直接运行。若sav文件中包含直接运行的程序,如果sav文件名与程序名一致,则可以直接双击sav文件运行;如果文件类型默认打开程序有误,可手动选择idl安装目录下的‘bin\bin.x86\idlrt_admin.exe’打开sav类型。

(3)虚拟机调用。单击系统菜单【开始】-【程序】-【idl *】-【Tools】-【IDL Virtual Machine】,启动idl虚拟机,执行sav文件。

注意:若sav文件名与运行程序名称不一致,在程序中或命令行下需要先‘restore’,然后在调用运行程序名称执行程序。

2.exe发布

在创建完SAV文件后,就可以利用SAV文件发布EXE程序了。

idl通过make_rt命令输出为EXE文件

2.1 IDL程序

(1)明确信息

工程主程序名称:helloworld;

确定发布后目录:如‘D:\IDLPROJ\test’,目录非空则调用make_rt时使用关键字‘overwrite’;

确认工程构建后sav文件存放路径,如‘D:\IDLPROJ\test\helloworld’

(2)运行make_rt

Syntax

MAKE_RT, Appname, Outdir, [, /DATAMINER] [, /DICOMEX] [/EMBEDDED] [, /GRIB] [, /HIRES_MAPS] [, /HIRES_SHAPEFILES] [, IDLDIR=path] [, /LIN32] [, /LIN64] [, LOGFILE=path] [, /MACINT64] [, MANIFEST=path] [, /OVERWRITE] [, SAVEFILE=path] [, /SUN64] [, /SUNX86_64] [, /VIDEO] [, /VM ] [, /WIN32] [, /WIN64]

Make_RT常用关键字:

Ÿ   Overwrite:覆盖之前发布的版本,重新生成文件

Ÿ   WIN32:发布程序以32位模式运行

Ÿ   WIN64:发布程序以64位模式运行

Ÿ   VM:以虚拟机模式运行发布的程序

程序中用到数据库、DICOM、GRIB等模块或功能函数时,要使用DATAMINER、DICOMEX、GRIB等关键字,否则发布后程序无法运行。

helloworld程序发布代码:

make_rt,'helloworld','D:\IDLPROJ\test\temp',savefile='D:\IDLPROJ\test\helloworld.sav',/overwrite

注意:目录必须已经存在,D:\IDLPROJ\test\temp,该命令不能新建文件夹。

(3)发布后处理

①添加相关文件

添加额外文件到发布的程序中;程序中使用到了某些配置文件或基础数据文件则需要拷贝到发布后程序对应的目录下,避免出现找不到文件的情况。

②修改程序运行配置文件

默认双击‘helloworld.exe’文件时,会启动弹出如下界面,如果不希望弹出该界面,可修改目录下包含一个与EXE文件同名的ini配置文件,用记事本打开编辑该文件。配置文件部分字段对应含义见下表:

33.png

字段含义
[DIALOG]主界面对话框的参数
Show=False

对话框界面是否弹出<True和False>

True:运行时先启动对话框界面,再出现虚拟机界面

False:运行时不启动对话框界面,直接出现虚拟机界面

BackColor=&H6B1F29对话框的背景颜色
Caption=<any string>对话框的标题文字
Picture=.\splash.bmp对话框需要显示的图像,标准大小480 x 335,若图像大则大的部分显示背景色;bmp格式
DefaultAction=<path to application>运行时执行的代码;
[BUTTON1]主界面上按钮1的参数


2.2ENVI二次开发程序

与IDL程序的发布基本一致。

二、程序部署

1.虚拟机方式

IDL虚拟机(Virtual Machin,VM)是一个免费的程序运行支撑平台。VM适用于所有IDL支持的操作系统平台,这样可以方便在各种操作系统上部署和运行IDL程序。

若当前操作系统已经安装了ENVI和IDL,则虚拟机已经安装,如果程序经过make_rt发布,文件夹中包含了IDL虚拟机,可直接运行。

虚拟机的限制如下:

  • 虚拟机必须是美国ExelisVis(原ITTVis)公司提供的,不允许进行更改;

  • 启动时会自动弹出虚拟机画面,需要在界面上单击鼠标在选择sav文件;

  • 虚拟机只能运行IDL6.0或更高版本生成的sav文件;

  • 不支持execute函数;

  • 不支持Callable、IDLDrawWidget、COM_IDL_CONNECT等混合编程技术;

  • 虚拟机默认不安装且不支持DataMiner、IDLffDicomEX和IDL-Java bridge等组件。

2.Runtime方式

这是一种高性价比的IDL发布方法,他不仅可以发布IDL程序,而且可以发布IDL与其他语言混合编程的程序。Runtime程序运行时是需要Runtime许可的,Runtime许可分为单机版(Single)和浮动板(Floating)

2.1单机版配置

单机版许可配置包括复制许可文件和设置系统变量两种方法。

复制许可文件到发布后的程序License目录下,即建立与IDL*目录同级的license目录,复制许可文件license.dat或license.lic文件到license目录下。

设置系统变量的步骤:右击【我的电脑】-选择【属性】-【高级系统设置】-【高级】-【环境变量】;单击系统变量中的【新建】,变量名设置为‘LM_LICENSE_FILE’,变量设为许可文件全路径(含许可文件名和后缀)。

2.2浮动板配置




http://blog.sciencenet.cn/blog-346157-1160628.html

上一篇:ENVI/IDL安装问题
下一篇:IDL混合编程

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2021-1-28 11:26

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部