在 JMP 18 中运行 Python 程序时,JMP 消失我一直在尝试熟悉 JMP 18 中的新 Python 接口。我正在探索的问题之一是:“是否有可能在 JMP 环境中编写一个执行 r 模块的 Python 程序。我正在使用的非常简单的程序是
# Import the necessary libraries
import numpy as np
from rpy2.robjects.packages import importr
import rpy2.robjects as ro
# Create a numpy array
data = np.array([1, 2, 3, 4, 5])
# Convert the numpy array to an R vector
r_vector = ro.FloatVector(data)
# Import the base package in R
base = importr('base')
# Calculate the mean of the vector in R
mean = base.mean(r_vector)
# Convert the mean back to a Python float
mean_py = np.array(mean)[0]
print(f"The mean of the data is {mean_py}")
我使用 JSL 安装了 rpy2 包
Python Install Packages( "rpy2");
安装没有问题。我还在我的原生 Python 3.8 版本和原生 Python 3.11 版本中安装了它
Python 代码在 Python 3.8 和 JMP 安装的 3.11 中运行时没有错误。
但是,在 JMP 18 下执行 Python 中的代码时,只要运行第 3 行,JMP 就会立即消失。
from rpy2.robjects.packages import importr
有人知道为什么会发生这种情况吗?
自动化和脚本回复:在 JMP 18 中运行 Python 程序时 JMP 消失我无法使用以下方法安装该软件包
Python Install Packages( "rpy2");
或者
import jmp
import jmputils
# update to latest version of pip and setuptools then install numpy & pandas
jmputils.jpip('install --upgrade', 'pip setuptools')
jmputils.jpip('install', 'rpy2')
我必须通过命令行。安装后,我遇到了同样的问题,当我导入 rpy2.robjects 时,JMP 就会关闭(导入 rpy2 似乎有效)。也许这与此处https://github.com/jupyterlab/jupyterlab/issues/4817之类的内容有关?
回复:在 JMP 18 中运行 Python 程序时 JMP 消失我认为这可能是 jupyterlab 问题 4871 中提到的问题的一部分。具体来说,是其中一个回复中提到的。
默认情况下,rpy2 将查找 PATH 中找到的第一个 R。可能发生的情况是 PATH 中的 R 与动态加载时获取的 R 共享库不匹配。
JMP 将 Python 作为共享库加载,因此任何共享库加载路径都需要位于 JMP 预期的位置。JMP 中嵌入的 Python 会加载 rpy2 模块,它的共享库将位于相应的 site-packages/ 目录中。然后 rpy2 尝试将 R 共享库加载到进程空间中。如果找不到库或由于冲突而加载失败,则会在 JMP 无法捕获的深处终止进程。这是我们很久以前尝试在 Windows 上使用 Conda 安装 Python 时遇到的问题。Conda 移动了默认位置并且没有设置 rpath,因此 JMP 找不到 Python 本身所依赖的 Dll,并且在尝试使用基于 Anaconda 的安装运行任何 Python 时会立即退出。此外,在 JMP 本身关闭之前,不会释放和卸载任何已加载的 Dll。
我不建议使用 rpy2。我个人的偏好/建议是使用 pyRserve。pyRserve 包是一个 Python 瘦客户端,它通过 TCP/IP 与 Rserve 服务器通信。$SAMPLE_SCRIPTS/Python/Rserve.py 中有一个例子,其中有大量关于配置和使用的注释。
这样可以更好地隔离进程,并且您无需将 R 加载到 Python 的地址空间中,而该地址空间位于 JMP 中。使用 Rserv,R 中的崩溃或问题将不会对 JMP 产生影响。此外,您的 Rserv 实例可以在任何地方运行。在 Windows 或 macOS 本地运行,在 Windows 上的 WSL(适用于 Linux 的 Windows 子系统)中运行,在远程计算机(Linux、macOS 等)上运行。远程 R 服务器可能需要额外的网络管理支持,例如防火墙和允许端口。在本地运行,这应该不是问题。
这是允许在 JMP 中加载 DLL 的危险之一。无论是从 Python 模块内部还是从我们自己的 JSL 加载 Dll 功能。加载的 DLL 中的崩溃或错误可能会导致 JMP 中出现无法恢复且未处理的错误。