java jython 调用,JavaDemo——Java通过Jython调用py脚本

maven导入:

org.python

jython-standalone

2.7.2

准备python文件test2.py:

#!/usr/bin/env python3

# coding=utf-8

xyz='hello python'

abc=1234

class Result:

s = ''

r = 0.0

def __init__(self, s, r):

self.s = s

self.r = r

def func_cls(x, y):

print('py fun=x^2+2xy+y^2')

print('x={0}, y={1}'.format(x, y))

return Result('pyResult', eval('x**2 + 2*x*y + y**2'))

def func_str():

return 'func2 return str'

def func_list():

return [11, 22, 33]

def func_dict():

return {1:'a', 2:'b', 3:'c'}

#没有变量newstr

def func_nostr():

return newstr

if __name__ == '__main__':

print('py main run')

# func_nostr()#NameError: name 'newstr' is not defined

调用demo:

/**

* 2020年7月6日上午10:16:29

*/

package testcallpython;

import org.python.core.PyDictionary;

import org.python.core.PyFloat;

import org.python.core.PyFunction;

import org.python.core.PyList;

import org.python.core.PyObject;

import org.python.core.PyString;

import org.python.util.PythonInterpreter;

/**

* @author XWF

*

*/

public class TestCallPython_Jython {

/**

* @param args

*/

public static void main(String[] args) {

PythonInterpreter interpreter = new PythonInterpreter();

//执行python语句

interpreter.exec("print('start test')");

interpreter.exec("print('='*50)");

//加载并运行python文件

interpreter.execfile("src/testcallpython/test2.py");

interpreter.exec("print('='*50)");

//调用py文件里的属性

PyObject xyzobj = interpreter.get("xyz");

System.out.println("xyz=" + xyzobj);

PyObject abcobj = interpreter.get("abc");

System.out.println("abc=" + abcobj);

interpreter.set("newstr", "newString");//手动添加newstr变量

System.out.println("newstr=" + interpreter.get("newstr"));

interpreter.exec("print('='*50)");

//调用py文件里的方法

PyFunction funcCls = interpreter.get("func_cls", PyFunction.class);

PyObject returnPyobj = funcCls.__call__(new PyFloat(2), new PyFloat(3));

System.out.println("结果:" + returnPyobj.toString());

System.out.println("class=" + returnPyobj.getClass());

System.out.println("s=" + returnPyobj.__findattr__("s"));

System.out.println("r=" + returnPyobj.__findattr__("r"));

System.out.println("ss=" + returnPyobj.__findattr__("ss"));

//System.out.println(returnPyobj.__getattr__("ss"));//Exception in thread "main" AttributeError: Result instance has no attribute 'ss'

interpreter.exec("print('='*50)");

PyFunction funStr = interpreter.get("func_str", PyFunction.class);

System.out.println(funStr.__call__().__tojava__(PyString.class));

System.out.println(funStr.__call__());

PyFunction funList = interpreter.get("func_list", PyFunction.class);

PyList list = (PyList) funList.__call__().__tojava__(PyList.class);

System.out.println(list);

System.out.println(list.get(2));

PyFunction funDict = interpreter.get("func_dict", PyFunction.class);

PyDictionary dict = (PyDictionary) funDict.__call__().__tojava__(PyDictionary.class);

System.out.println(dict);

System.out.println(dict.get(2));

PyFunction funcNostr = interpreter.get("func_nostr", PyFunction.class);

System.out.println(funcNostr.__call__());//手动添加newstr后可以正常调用

}

}

结果:

677b70987822393616694ceb2e4b2a54.png

有趣的是可以通过jython添加py里未定义的属性消除异常;

<think>好的,用户的问题是关于如何在Python中编写和调用脚本,并且需要示例代码。首先,我需要回忆Python脚本的基本结构和调用方法。用户可能对Python还不熟悉,所以需要从基础开始讲解。 根据用户提供的引用内容,特别是引用[1],里面提到了Python脚本的安装、环境设置、运行脚本、处理输入输出、异常处理、文件操作和模块导入。这些应该是用户关心的点。我需要将这些内容组织起来,分步骤说明如何编写和调用脚本。 第一步,创建Python脚本文件。通常以.py为扩展名,比如hello.py。这里可以引用用户提供的引用[5],其中有一个hello.py的示例,定义了hello()和add()函数。这个例子很基础,适合作为示例代码。 第二步,运行脚本。用户可能知道如何运行,但为了全面,需要说明在命令行中使用python hello.py,或者在IDE中运行。另外,还可以提到直接执行.py文件需要添加shebang行,不过这在Windows和类Unix系统上可能有所不同,可能需要简要说明。 第三步,调用脚本中的函数。这里可能需要展示如何在一个脚本中导入另一个脚本。例如,在另一个脚本中使用import hello,然后调用hello.hello()。需要确保用户理解模块导入的机制,尤其是当前目录下的模块导入。 第四步,处理命令行参数。用户可能需要知道如何让脚本接受外部输入,比如使用sys.argv或者更复杂的argparse模块。示例代码中使用sys.argv来展示基本用法,适合初学者。 第五步,跨语言调用。根据用户提供的引用[2]、[3]、[4],用户可能对在Java或C#中调用Python脚本感兴趣。例如,引用[2]中的Java代码使用JythonPythonInterpreter来执行Python脚本。而引用[3]和[4]涉及IronPython与C#的集成。需要简要说明这些方法,但可能用户主要关注Python本身的调用,所以这部分可以作为扩展内容,提供示例但不过于深入。 接下来,生成相关问题。需要考虑用户可能进一步想知道的内容,比如如何传递参数、处理异常、跨语言调用的其他方式、模块化脚本的好处等。结合引用中的内容,比如引用[1]提到的处理异常和导入模块,可以生成相关问题。 需要确保所有数学公式和代码格式正确。根据系统级指令,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能涉及较少数学内容,更多是代码示例。代码块需要用三个反引号包裹,并标明语言。 最后检查引用是否正确添加,比如在提到安装Python时引用[1],在Java调用时引用[2],IronPython部分引用[3]和[4],示例代码引用[5]。确保每个引用标识自然出现在相关内容末尾,并且没有遗漏。 总结回答结构:分步骤讲解编写和调用脚本的方法,每个步骤附示例代码,涵盖基础调用、函数导入、命令行参数、跨语言调用,最后生成相关问题。确保语言简洁,符合中文表达,避免使用专业术语过多,必要时给出解释。</think># Python脚本编写与调用方法详解 ### 一、创建Python脚本文件 创建一个以`.py`为扩展名的文件,例如`hello.py`,包含以下基础结构: ```python # -*- coding: utf-8 -*- def greet(name): print(f"你好,{name}!") if __name__ == "__main__": greet("世界") # 直接运行脚本时执行 ``` *代码功能说明*:定义`greet()`函数并通过`__name__ == "__main__"`判断实现脚本自执行逻辑[^5] ### 二、运行脚本的三种方式 1. **命令行执行**(需配置Python环境变量[^1]) ```bash python hello.py ``` 2. **IDE直接运行** 在PyCharm/VSCode等工具中右键选择`Run File` 3. **可执行文件模式**(Unix/Linux系统) ```python #!/usr/bin/env python3 # 添加shebang声明 chmod +x hello.py ./hello.py ``` ### 三、跨脚本调用函数 创建`caller.py`调用其他脚本: ```python import hello hello.greet("开发者") # 调用hello.py中的函数 print(hello.add(3,5)) # 调用加法函数[^5] ``` ### 四、处理命令行参数 ```python import sys if len(sys.argv) > 1: print(f"接收到的参数:{sys.argv[1:]}") else: print("未提供参数") ``` *执行示例*:`python args.py apple 42` 输出参数列表 ### 五、跨语言调用示例 1. **Java调用**(使用Jython[^2]) ```java PythonInterpreter interpreter = new PythonInterpreter(); interpreter.execfile("demo.py"); // 执行Python脚本 ``` 2. **C#调用**(使用IronPython[^3][^4]) ```csharp var engine = Python.CreateEngine(); engine.ExecuteFile("demo.py"); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值