如何在IDL中使用pref_set命令

时间:2015-01-13 10:37:34

标签: bash idl-programming-language

我想将目录添加到IDL Path,并使用:

pref_set,'IDL_PATH','+/home/mydirectory/Tools/IDL/:<IDL_DEFAULT>',/COMMIT

它有效,但当我从IDL退出并再次启动时,我输入:

.run myfile

“myfile”是“mydirectory”中的一个,并且出现错误:

% Error opening file. File: myfile

每次启动IDL以使其工作时我都需要pref_set ...。这是为什么? 我使用Ubuntu 14.04和bash。 IDL 8.4。

幸运的是,我的同事帮助我找到了解决方案。在.bashrc中添加路径。

export IDL_PATH= '+/mydirectory/IDL:<IDL_DEFAULT>'

请注意,单引号和+在此非常重要。这是IDL语法而不是bash。希望它可以帮助任何人遇到同样的问题。 ;)

2 个答案:

答案 0 :(得分:1)

这对你有用。再次启动IDL后检查!path系统变量:

IDL> print, !path

您的目录应该是第一个条目。

另外,检查首选项文件以查看它是否实际被更改。使用PREF_SET后,退出IDL并检查文件:

cat ~/.idl/idl/pref-10-idl_8_4-unix

文件中应该有IDL_PATH的条目。

答案 1 :(得分:1)

这实际上取决于您使用的IDL版本。如果您使用的是6.2和7.0.3之间的IDL版本,则使用PREF_SET来控制路径。在6.2之前,您可以在Ubuntu中设置环境变量并修改IDL设置bash文件(应该带有IDL)。在v7.0.3之后,您可以将!PATH的值显式设置为字符串。

您需要知道操作系统的搜索路径分隔符。如果您使用的是IDL v5.5或更高版本,则可以定义:

sepath_sep = PATH_SEP(/SEARCH_PATH)

对于Linux来说可能是:(至少对于Unix来说)。您还需要知道当前的工作目录,可以通过以下方式定义:

vern           = !VERSION.RELEASE       ;;  e.g., '7.1.1'
test           = (vern[0] GE '6.0')
IF (test[0]) THEN cwd_char = FILE_DIRNAME('',/MARK_DIRECTORY) ELSE cwd_char = '.'+slash[0]
cur_wdir       = FILE_EXPAND_PATH(cwd_char[0])
;;  Check for a trailing slash and add it if need be...

要查找当前工作目录中的所有子目录,您可以执行以下操作:

t_path0        = EXPAND_PATH('+'+cur_wdir[0],/ARRAY)
t_path         = STRJOIN(t_path0,sepath_sep[0],/SINGLE)

通常,我不止一件事要确保IDL可以找到我的文件。我设置了一个环境变量,并指定了!PATH系统变量(我有v7.1.1)。您可以通过以下方式在IDL中执行此操作:

;;  First define the location of the IDL libraries
def_idldir     = !DIR                         ;;  e.g., '/Applications/itt/idl71'
test           = (GETENV('IDL_DIR') EQ '')
IF (test) THEN env_idldir = def_idldir[0] ELSE env_idldir = GETENV('IDL_DIR')
;;  Again, check for trailing slash here and add if absent
IF (test) THEN SETENV,'IDL_DIR='+env_idldir[0]
;;  First check whether an initial path exists
;;    --> If not, set one
idlpath        = GETENV('IDL_PATH')
test_idl       = (idlpath[0] EQ '')
IF (test_idl) THEN new_path = t_path[0] ELSE new_path = t_path[0]+sepath_sep[0]+idlpath[0]
IF (test_idl) THEN SETENV,'IDL_PATH='+new_path[0]
;;  Test to see if after version 7.0.3 and/or after version 6.2
test__62       = (vern[0] GE '6.2') AND (vern[0] LT '7.0.3')
test_703       = (vern[0] GE '7.0.3')
IF (test__62) THEN PREF_SET,'IDL_PATH',new_path[0],/COMMIT
IF (test_703) THEN !PATH = EXPAND_PATH(new_path[0])

这应该为您提供正确的路径规范。