我遇到了一个问题,我在 Windows 上使用 Java 的 ProcessBuilder 创建 Python 虚拟环境,但是以这种方式创建的环境(也从以相同方式结束的终端尝试过)无法安装 same 依赖项当我使用 相同的基本 Python 可执行文件从 PyCharm 创建虚拟环境时,工作得很好。详细内容如下:
我使用相同的 Python 可执行文件(已验证)通过 PyCharm 和 Java 代码中的 ProcessBuilder 创建环境。 在 PyCharm 中创建的虚拟环境运行良好,我可以毫无问题地安装所有必要的依赖项。 然而,在我的 Java 代码中通过 ProcessBuilder 创建的虚拟环境无法安装相同的依赖项,并且在尝试安装它们时出现错误,特别是在权限和包冲突方面。 核心问题是,使用 ProcessBuilder 创建的虚拟环境似乎存在依赖项安装问题,即使它基于与 PyCharm 中创建的相同的 Python 可执行文件。
冲突的原因是: mediapipe 0.10.0 取决于 protobuf<4 and >=3.11 Tensorboard 2.10.1 依赖于 protobuf<3.20 and >=3.9.2
这些依赖项位于 pycharm 中创建的 venv 中,并且 它可以工作。 我在 pycharm 中创建了多个 venv 试图让它失败,这样我就可以看到问题出在哪里,除了明显的依赖问题之外,它们都有效。 把protobuf的-v改成满足依赖问题的,代码就不行了哈哈。
有人在通过 Java 的 ProcessBuilder/终端管理虚拟环境时经历过这种不一致吗?这可能与权限问题有关,还是 PyCharm 和 Java 处理环境创建的方式可能有所不同?
private void crearYActivarAmbienteVirtual() {
try {
// Command to create the virtual environment
String[] createCommand = {
"C:\\Python310\\python.exe",
"-m",
"venv",
"C:\\venv"
};
runProcess(
createCommand,
"Ambiente Virtual",
"El ambiente virtual se ha creado correctamente.",
"Error al crear el ambiente virtual."
);
// Directly invoke pip from the virtual environment
String pipPath = "C:\\venv\\Scripts\\pip.exe"; // Adjust for Windows paths
String[] installCommand = {
pipPath,
"install",
"-r",
"src/main/resources/PythonScript/requirements.txt"
};
runProcess(
installCommand,
"Requerimientos",
"Los requerimientos se han instalado correctamente.",
"Error al instalar los requerimientos."
);
} catch (IOException | InterruptedException e) {
Platform.runLater(() -> queueNotification("Error", "Error al configurar el ambiente virtual.", true));
}
}
private void runProcess(String[] command, String title, String successMsg, String errorMsg) throws IOException, InterruptedException {
Process process = new ProcessBuilder(command).start();
process.waitFor();
if (process.exitValue() == 0) {
Platform.runLater(() -> queueNotification(title, successMsg, false));
} else {
Platform.runLater(() -> queueNotification("Error", errorMsg, true));
}
}
对于错误,我只是在终端中执行相同的操作,看看抛出了什么
错误:无法安装 -r src/main/resources/PythonScript/requirements.txt (第 46 行)、-r src/main/resources/PythonScript/requirements.txt (第 78 行)和 protobuf==3.20.3 因为这些包版本具有冲突的依赖关系。
冲突的原因是: mediapipe 0.10.0 取决于 protobuf<4 and >=3.11 Tensorboard 2.10.1 依赖于 protobuf<3.20 and >=3.9.2
简化您的脚本,如下所示。
@echo off
chcp 65001
python -m venv test
call test\Scripts\activate
pip install -r requirements.txt
python xxxx.py