0x00 前言
最近需要解析欧洲中期天气预报中心(ECMWF)的相关数据,在查阅相关文档时,发现有现成的Metview工具可用,并且可以直接解析ECMWF的数据集。相关显示如下图所示:
0x01 问题
“On Windows, signal() can only be called with SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, or SIGTERM. A ValueError will be raised in any other case.”
在idea中运行测试程序显示以上,本以为全网搜索一下该问题的解决办法,但是得到的答案只有尝试使用conda进行二进制文件编译,对python下的metview包重新安装。
Could not run the Metview executable (‘metview’); check that the binaries for Metview (version 5 at least) are installed and are in the PATH.
倒腾了一番后,最后还是显示以上,没办法,只有去看看metview的代码接口是怎么编写。
0x02 metview接口源码
try:
ffi = cffi.FFI()
ffi.cdef(pkgutil.get_data("metview", "metview.h").decode("ascii"))
mv_lib = mi.info("METVIEW_LIB")
# is there a more general way to add to a path to a list of paths?
os.environ["LD_LIBRARY_PATH"] = mv_lib + ":" + os.environ.get("LD_LIBRARY_PATH", "")
try:
# Linux / Unix systems
lib = ffi.dlopen(os.path.join(mv_lib, "libMvMacro.so"))
except OSError:
# MacOS systems
lib = ffi.dlopen(os.path.join(mv_lib, "libMvMacro"))
except Exception as exp: # pragma: no cover
print(
"Error loading Metview/libMvMacro. LD_LIBRARY_PATH="
+ os.environ.get("LD_LIBRARY_PATH", "")
)
raise exp我们从以上代码可以看出,它只对Linux / Unix 和 MacOS进行了处理,没有windows系统的环境要求,爆炸,没办法,那就本地开一个WSL2吧!当然,如果用VM开一个linux的虚拟机也可以。
0x03 寻找答案
如果在Windows系统下直接进行安装:
conda install metview -c conda-forge
pip install metview以上是一个错误的示范,因为官网上还有一行字:
该软件无法在windows下运行,OK,我们在开启win11(非WIN11可能无法开启)的WSL2功能后,使用ubuntu24.04这个镜像,导入开机。
按照常规来讲,其实可以直接使用以下命令来直接安装编译好的metview版本:
sudo apt install metview但是问题来了,这个编译好后的二进制文件里,貌似没有相关的动态链接库,会显示以下报错:
Error loading Metview/libMvMacro. LD_LIBRARY_PATH=0x04 最终答案
那么,我们只能通过brew这个包管理工具来安装metview。这里metview官方也是会在brew上维护这个软件,所以不存在什么兼不兼容的问题。
brew install metviewOK,在经过漫长的等待后,我们终于安装成功,并且成功将python环境和metview绑定:
由于我们是使用brew进行安装的,所以metview的目录会和正常目录有所不同,需要在执行python文件时手动指定环境变量,这也是一个坑。最后我们在阅读python的metview的源代码后成功解决:
signal.signal(signal.SIGUSR1, self.signal_from_metview)
# p = subprocess.Popen(['metview', '-edbg', 'tv8 -a', '-slog', '-python-serve',
# env_file.name, str(pid)], stdout=subprocess.PIPE)
metview_startup_cmd = os.environ.get("METVIEW_PYTHON_START_CMD", "metview")
metview_flags = [
metview_startup_cmd,
"-nocreatehome",
"-python-serve",
env_file.name,
str(pid),
]METVIEW_PYTHON_START_CMD,OK,指定这个变量即可,例如我这里是:os.environ['METVIEW_PYTHON_START_CMD'] = '/home/linuxbrew/.linuxbrew/bin/metview'
GOOD,完美解决所有问题!
0x05 总结
本次测试环境如下列表:
| 宿主机 | Windows 11 23H2 |
| WSL2 | Ubuntu 24.02 |
IEDA配置远程SDK,如下图所示:
注意,这里我是创建了一个.venv即虚拟环境,否则无法安装相应的包,通过以下命令处理。收工!
python3 -m venv path/to/venv
source path/to/venv/bin/activate





评论 (0)