IDL 8.7 Python Bridge 试用

HARRIS 官网 申请了 IDL 8.7 的 Linux 版本试用, 咨询客服之后终于收到了链接.

先测试一下 Python Bridge 功能.

  • Ubuntu 16.04 LTS
  • Python 3.6 Anaconda
  • 需要使用收到的激活码 (试用期一个月. 激活之后运行程序不会自动退出)

参考 Python Bridge 官方文档

1. 安装

下载之后解压这两个文件:
envi55-linux.tar.gz
flexnetserver2017.08-linux.tar.gz

以安装至 ~/software/harris 为例.
执行安装脚本:

1
2
$ ./envi55-linux/install.sh
$ ./flexnetserver2017.08-linux/install.sh


添加路径到 ~/.bashrc (注意将 miniconda3/lib 替换成你的 python lib 路径):

1
2
3
# ~/.bashrc
export LD_LIBRARY_PATH=$HOME/miniconda3/lib:$HOME/software/harris/envi/idl/bin/bin.linux.x86_64:$LD_LIBRARY_PATH
source $HOME/software/harris/envi55/bin/envi_setup.bash

(如果 miniconda3/lib 加入到 LD_LIBRARY_PATH 之后影响了其他程序使用, 因此处理方法见 Troubleshooting)

随后

1
$ source ~/.bashrc

2. 激活

经过上述步骤, 图形界面的激活程序 harrislicense 已被加入系统路径.

打开

1
$ harrislicense

或使用命令行

1
2
3
4
5
6
7
8
9
$ cd ~/software/harris/envi/idl/license_utils/bin.linux.x86_64

# Activate
$ ./activate -a <activation-code> [-q <quantity>]
# e.g.
$ ./activate -a <activation-code> -q 1

# Deactivate
$ ./activate -a <activation-code> -q 0

必要时将会提示需要 root 权限.

3. 安装 IDL Python bridge

首先确认 python 命令在系统路径 PATH 中.

安装

1
2
$ cd ~/software/harris/envi/idl/lib/bridges
$ python setup.py install

4. 使用

能使用的功能比较有限.

1
2
3
4
5
6
>>> from idlpy import *
>>> print(f"{IDL.run('for i=0, 3 do begin & print, i & endfor')}")
0
1
2
3
1
IDL> >>>import matplotlib.pyplot as plt

注意用这种写法时, python 的 >>> 提示符之后没有空格.

或使用语句块 (Enter 退出):

1
2
3
4
5
6
7
8
IDL> >>>
>>> import matplotlib.pyplot as plt
>>> import numpy.random as ran
>>> arr = ran.rand(100)
>>> p = plt.plot(arr)
>>> plt.show()
>>>
IDL>

或使用以下方式将 python 语句结果赋值:

1
2
3
4
5
6
7
8
9
10
11
12
13
IDL> np = Python.Import('numpy')
IDL> arr = np.array([1., 2., 3.])
IDL> help, arr
ARR FLOAT = Array[3]
IDL> arr = np.arange(3)
IDL> help, arr
ARR LONG64 = Array[3]
IDL> arr = np.arange(3.)
IDL> help, arr
ARR DOUBLE = Array[3]
IDL> arr = np.ones(3)
IDL> help, arr
ARR DOUBLE = Array[3]

其他用法参见官方文档:

5. Troubleshooting

出现 > .../lib/libuuid.so.1: no version information available ...

这是因为使用 anaconda 的 python, 默认调用的是 anaconda 的 libuuid.so.1, 版本较低, 使用系统的 libuuid.so.1 即可解决.

或者出现 miniconda3/lib 加入 LD_LIBRARY_PATH 之后影响其他程序调用的情况.

同时考虑可能出现的这两种问题的解决办法如下:

使用自定义脚本替代 idl 命令

由于 idl 使用了 alias 来调用程序, 优先级最高, 因此需要在 .bashrc 中重新 alias.

以 miniconda3 为例, 新建脚本(注意替换相应路径):

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

# python lib
export LD_LIBRARY_PATH=$HOME/miniconda3/lib:$LD_LIBRARY_PATH:$HOME/software/harris/envi/idl/bin/bin.linux.x86_64:$LD_LIBRARY_PATH

# libuuid issue
export LD_LIBRARY_PATH=/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

echo "=== $0 ==="
$HOME/software/harris/envi55/idl87/bin/idl $@

假设将脚本放在 ~/bin , 保证该路径在 PATH 中 ( export PATH=$HOME/bin:$PATH ).

~/.bashrc 中去掉 安装 中添加的 LD_LIBRARY_PATH 行, 并在 envi_setup.bash 行之后添加:

1
alias idl=$HOME/bin/idl

执行

1
$ source ~/.bashrc

之后再用 idl 命令即调用的是自定义的脚本.