java执行python时脚本引用动态配置文件遇到的问题

news/2024/11/1 21:51:10/

javapython_0">java执行python时脚本引用动态配置文件遇到的问题

当使用java去执行python脚本的时候,有时候会根据不同的传入参数去导入不同的组件。如我会根据传入的json参数param.username,去指定不同用户的配置文件,例如

python">import importlibdef load_config(username_name):try:config_module = importlib.import_module(f'config_{username_name}')return config_moduleexcept ImportError:print(f"Error: Configuration module 'config-{username_name}' not found.")sys.exit(1)

如果直接使用控制台执行,其结果是正常的。

但若通过java使用jython-standalone工具去执行,如

java">public static PyObject callPythonByJson(String fileUrl, String method, PyObject pyObject) {PythonInterpreter interpreter = new PythonInterpreter();interpreter.execfile(fileUrl);PyFunction pyFunction = interpreter.get(method, PyFunction.class);PyObject res = pyFunction.__call__(pyObject);interpreter.close();return res;
}

执行时会出现找不到模块的异常

ImportError: No module

按照网上的一些说法,是因为jython在执行时没有将脚本所在的目录添加到模块搜索路径中,因此找到的解决方案基本都是去获取脚本所在的目录,再将该目录添加到sys.path中

python">import sys
import os# 获取脚本所在的目录
script_dir = os.path.dirname(os.path.abspath(__file__))# 将脚本所在的目录添加到sys.path中
if script_dir not in sys.path:sys.path.append(script_dir)

如果大多人做到这里能够正常成功,那就没问题了。

但我的程序中还是出现了问题:

NameError: global name '__file__' is not defined

因此我需要换种方式去获取脚本的路径

python">import inspectscript_dir = inspect.getfile(inspect.currentframe())

此时拿到的script_dir是该脚本文件的路径(包括文件名)。

而我需要的只是它的目录路径而已。

由于我的文件名是固定格式:adapter.py

因此我只需要将后边的文件名裁切就ok了

python">script_dir = inspect.getfile(inspect.currentframe())[:-10]

最终的代码样例如下:

python"># -*- coding: UTF-8 -*-
import sys
import os
import importlib
import inspectdef main(params):username = params["username"] # 获取用户名config_name = "config_" + username; # 获取引入的模块名script_dir = inspect.getfile(inspect.currentframe())[:-10] # 获取当前脚本文件目录路径print(script_dir)sys.path.append(script_dir) # 将当前目录添加到sys.path,以便导入同一目录下的模块config_module = importlib.import_module(config_name) # # 导入同目录下的指定模块

http://www.ppmy.cn/news/1543695.html

相关文章

《双指针篇》---双指针算法原理

利用数组下标来充当指针。 1.双指针算法本质: 将数据划分为三个区间,我们以移动零为例: 给定数组中。 【0,left】:全是非0元素。 【left1,cur-1】:全是0元素。 【cur,n-1】&#xff…

【MySQL】视图特性 用户管理

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是视图,我们又该如何管理用户。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! >…

青少年编程与数学 02-002 Sql Server 数据库应用 17课题、事务处理

青少年编程与数学 02-002 Sql Server 数据库应用 17课题、事务处理 课题摘要:一、事务处理二、注意事项三、应用示例 本课题介绍了SQL Server 2022中的事务处理机制,包括事务的概念、ACID原则(原子性、一致性、隔离性、持久性)以及如何使用T-…

Notepad++ 插件安装,The plugin package is not found问题

问题: 今天想用自己电脑的Notepad来分析一下几个json文件,后续工作传输都使用json通信,公司装了jsonView插件都没什么问题。自己电脑装了就问题百出: 本人版本: 揣测1: 是不是管理员权限的问题,…

Flink CDC系列之:学习理解standalone模式

Flink CDC系列之:学习理解standalone模式 准备工作启动和停止本地集群设置 Flink CDC提交Flink CDC Job 独立模式是 Flink 最简单的部署模式。本简短指南将向您展示如何下载、安装和运行 Flink 的最新稳定版本。 您还将运行一个示例 Flink CDC 作业并在 Web UI 中查…

客户案例 | Ansys助力Lumotive将设计周期缩短两到三个数量级

“我们使用Ansys Lumerical FDTD、亚马逊云科技(AWS)和 Python API设计了这种超表面,同时使其与CMOS制造公差兼容。Lumerical的AWS解决方案有助于Lumotive将设计周期缩短两到三个数量级,而且不会增加成本或降低准确性。” —— P…

uni-app在H5页面唤起小程序登录 然后再回到当前页面

在H5页面触发小程序方法跳转到登录页面 wx.miniProgram.navigateTo({ url: /pages/login/index?webviewRedirect encodeURIComponent(redirectUrl) }); 携带对应的返回地址 在等于成功之后触发webViewPage 携带token if (this.webviewRedirect) { const tempUrl decodeU…

MySQL 复合索引测试

对MySQL复合索引结合具体示例,各条件下索引使用情况的运行结果及分析。 目录 复合索引示例 创建表 新增数据 查询数据 选项A SQL查询 explain分析 选项B SQL查询 explain分析 选项C SQL查询 explain分析 选项D SQL查询 explain分析 选项E SQL查询…