离线迁移conda环境(使用conda pack)后,在新平台上,导入xesmf时出错:
Traceback (most recent call last).
File "/home/xxx/miniconda3/envs/nc2p/lib/python3.11/site-packages/esmpy/interface/loadESMF.py", line 144, in
_ESMF = ct.CDLL(os.path.join(libsdir,'libesmf_fullylinked.so'),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/xxx/miniconda3/envs/nc2p/lib/python3.11/ctypes/init.py", line 376, in init
self._handle = _dlopen(self._name, mode)
^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: /home/conda/feedstock_root/build_artifacts/esmf_1677849384616/h_env_placehold_placehold_placehold_placehold_placehold_placehold placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold placeh/lib/libesmf_fullylinked.so: cannot open shared object file: No such file or directory
Traceback (most recent call last).
File "/home/xxx/miniconda3/envs/nc2p/lib/python3.11/site-packages/esmpy/interface/loadESMF.py", line 144, in
_ESMF = ct.CDLL(os.path.join(libsdir,'libesmf_fullylinked.so'),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/xxx/miniconda3/envs/nc2p/lib/python3.11/ctypes/init.py", line 376, in init
self._handle = _dlopen(self._name, mode)
^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: /home/conda/feedstock_root/build_artifacts/esmf_1677849384616/h_env_placehold_placehold_placehold_placehold_placehold_placehold placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold placeh/lib/libesmf_fullylinked.so: cannot open shared object file: No such file or directory
我知道迁移环境后操作系统路径有问题,那么如何更改LINK路径?我已经在新平台上成功部署了 ESMF。
My libesmf_fullylinked.so is in /home/xxx/miniconda3/envs/nc2p/lib/libesmf_fullylinked.so in python and /home/xxx/xx/esmf-8.6.0/lib/libO/Linux.intel.64.mpiuni.default in ESMF
你遇到的问题是
xesmf
依赖的
ESMF
库链接路径在迁移后不正确。
你可以尝试以下几种方法解决:
方法一:设置环境变量
-
找到
libesmf_fullylinked.so
的正确路径 : 根据你的描述,它位于/home/xxx/miniconda3/envs/nc2p/lib/
或/home/xxx/xx/esmf-8.6.0/lib/libO/Linux.intel.64.mpiuni.default
。 -
设置
LD_LIBRARY_PATH
环境变量 : 将libesmf_fullylinked.so
所在路径添加到LD_LIBRARY_PATH
环境变量中。 你可以在终端执行以下命令:
bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/miniconda3/envs/nc2p/lib/
或者
bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/xx/esmf-8.6.0/lib/libO/Linux.intel.64.mpiuni.default
注意
: 将上述命令中的路径替换为你的实际路径。 这条命令只在当前终端会话有效。 为了使更改永久生效,你需要将这条命令添加到你的 shell 配置文件(例如
~/.bashrc
或
~/.zshrc
)中。
-
重新激活conda环境
:
bash conda deactivate conda activate nc2p
方法二:修改
esmpy
的配置文件
-
找到
esmpy
的安装路径 : 你可以使用以下命令找到它:python import esmpy print(esmpy.__path__)
这将会打印出类似
/home/xxx/miniconda3/envs/nc2p/lib/python3.11/site-packages/esmpy
的路径。 -
修改配置文件 : 在
esmpy
的安装路径下找到interface
文件夹, 然后打开loadESMF.py
文件。 找到以下代码行:python _ESMF = ct.CDLL(os.path.join(libsdir,'libesmf_fullylinked.so'),
将它修改为:
python _ESMF = ct.CDLL('/home/xxx/miniconda3/envs/nc2p/lib/libesmf_fullylinked.so')
注意
: 将上述代码中的路径替换为你的
libesmf_fullylinked.so
的实际路径。
-
保存文件并重新启动 Python
: 保存对
loadESMF.py
文件的修改,然后重新启动你的 Python 解释器或 IDE。
方法三:使用
patchelf
修改链接路径
patchelf
可以直接修改可执行文件或库文件的依赖库路径。
-
安装
patchelf
:bash sudo apt install patchelf # Ubuntu/Debian sudo yum install patchelf # CentOS/RHEL
-
修改
esmpy
依赖库路径 :bash patchelf --set-rpath '$LD_LIBRARY_PATH:/home/xxx/miniconda3/envs/nc2p/lib/' /path/to/esmpy/module.so
将
/path/to/esmpy/module.so
替换为实际的esmpy
模块路径。
注意
: 使用
patchelf
需要谨慎,因为错误的操作可能会损坏你的文件。 建议在操作前备份你的文件。
请选择其中一种方法尝试解决问题。 如果问题仍然存在,请提供更多信息,例如你的操作系统版本,ESMF 版本,以及完整的错误信息。
标签:python,conda,offline From: 78792556