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) # # 导入同目录下的指定模块