java在python沙箱环境下执行脚本文件

上一篇文章我演示了通过命令行的方式安装virtualenv,以及激活使用python沙箱环境。但是我实际的需求需要通过java来执行该脚本,因此命令行方式的激活沙箱是不合适的。此时,就需要另外一种无需手动激活的方式来使用。

一,关于activate_this.py文件

virtualenv提供了一个无需手动激活沙箱环境的文件activate_this.py,使用方式如下(Mac python3.7):

import os
import sys

activate_this = '/Users/sw/Documents/virtualenv/venv/bin/activate_this.py'
exec(open(activate_this, encoding='utf-8').read())
cmd = "/Library/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python /Users/sw/Documents/virtualenv/venv/service-api/xxx.py "
os.system(cmd)

原本我们想要在沙箱环境下执行xxx.py的操作如下(我的虚拟环境名称为my_virtual_env):

> cd my_virtual_env # 进入虚拟环境目录
> source bin/activate # 激活虚拟环境
(my_virtual_env)> python /Users/sw/Documents/virtualenv/venv/service-api/xxx.py
(my_virtual_env)> deactivate # 退出虚拟环境

使用activate_this.py文件的方式如下:

  1. 创建启动文件start.py

    import os
    import sys
    
    activate_this = '/Users/sw/Documents/virtualenv/venv/bin/activate_this.py'
    exec(open(activate_this, encoding='utf-8').read())
    cmd = "/Library/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python /Users/sw/Documents/virtualenv/venv/service-api/xxx.py "
    os.system(cmd)
    
  2. 通过start.py执行xxx.py

> python start.py

二,java在沙箱环境下执行xxx.py

public Object adapter() throws IOException, InterruptedException {

        ProcessBuilder processBuilder = new ProcessBuilder("/Library/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python", scriptPath + "start.py");
        Process process = processBuilder.start();
        InputStreamReader ir = new InputStreamReader(process.getInputStream());
        LineNumberReader input = new LineNumberReader(ir);
        String result = input.readLine();
        input.close();
        ir.close();
        process.waitFor();
        log.info("result = " + result);
        result = result.replace("b'", "");
        result = result.replace("}'", "}");
        result = result.replace("\\\\", "\\");
        JSONObject object = JSONObject.parseObject(result);
        return object;
    }

此时,就能够在virtualenv环境下执行脚本文件,获取结果。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐