JAVA远程调用Python程序

2021-06-11 17:09发布

java要如何通过HTTP远程调用服务器上一个正在运行的python程序的函数传送参数,并返回结果。

java要如何通过HTTP远程调用服务器上一个正在运行的python程序的函数传送参数,并返回结果。

4条回答
flame
2楼 · 2021-06-15 14:49

你想要这样做的主要原因是你可以运行cpython代码,它完全控制你的java对象。在决定尝试使用python(就像一匹马)来尝试和java(就像一只黑猩猩)一样,需要考虑一些重要的事情。首先,如果你让翻译失败,你的节目就会熄灯!并没有让我开始处理并发问题!此外,还有分配锅炉,我相信我找到了最好的配置,以尽量减少这个锅炉,但它仍然是分配!那么如何解决这个问题:考虑到C ++是你的中间人,你的对象实际上是c ++对象!好,你现在知道了。只需将您的对象编写为cpp中的程序,而不是使用您希望从两个世界访问的数据。然后你可以使用名为swig的包装器生成器([http://www.swig.org/Doc1.3/Java.html)]使java可以访问它并编译一个你称之为System.load的dll(这里的dll名称) )在java中。首先让这个工作,然后继续努力!要进入python,您需要嵌入一个解释器。首先,我建议做一些hello解释程序或本教程在C / C中嵌入python。一旦你有了工作,就有时间让马和猴子跳舞!您可以通过[boost] [3]将c ++对象发送给python。我知道我没有给你鱼,只是告诉你在哪里找到鱼。编译时需要注意的一些指示。


编译boost时,需要编译共享库。 你需要在jdk中包含和链接你需要的东西,即jawt.lib,jvm.lib,(启动应用程序时你的路径中还需要客户端jvm.dll)以及python27.lib或者 无论如何以及boost_python-vc100-mt-1_55.lib。然后包括Python / include,jdk / include,boost和仅使用共享库(dll),否则boost有一个teary。 我知道,是的。 有很多方法可以解决这个问题。 因此,请确保逐块完成每件事。 然后把它们放在一起。


小朋友
3楼 · 2021-08-16 16:12

直接用socket. 自己定义协议: 函数名, 参数值会怎么传递, 返回值要怎么传递等.http: 用http协议, 函数名, 参数值等可以用GET/POST的参数传递. 但你要自己把复杂些的值(字典, 列表等)序列化(pickle, json等) python有很多web framework, 也可以用自带的httpserverrpc: 把上面的东西都包装起来, 用起来很像直接的函数调用. 文档(https://docs.python.org/2/library/xmlrpclib.html), 里面有例子, 也可以自己搜python+模块名.

职场老油条
4楼 · 2021-08-20 16:03

直接用socket. 自己定义协议: 函数名, 参数值会怎么传递, 返回值要怎么传递等.http:

py大白
5楼 · 2021-10-18 09:41

通过Pyro从Jython到CPython的Java


Pyro是python的远程对象模块。 你在cpython解释器上有一些对象,你可以发送它通过序列化传输的对象,它也可以通过这种方法返回对象。 请注意,如果从jython发送序列化的python对象,然后调用一些更改其成员中的数据的函数,那么您将不会在java中看到这些更改。 您只需要记住从pyro发回您想要的数据。 我相信这是进入cpython的最简单方法! 你不需要任何jni或jna或swig或....你不需要知道任何c或c ++。 嗯嗯?


优点:访问cpython,不像以下方法那么困难


缺点:无法直接从python更改java对象的成员数据。 有点间接,(jython是中间人)。


Java到C / C ++通过嵌入式解释器通过JNI / JNA / SWIG到Python(也许使用BOOST库?)


OMG这种方法不适合胆小的人。而且我可以告诉你,用一种不错的方法实现这一目标需要很长时间。你想要这样做的主要原因是你可以运行cpython代码,它完全控制你的java对象。在决定尝试使用python(就像一匹马)来尝试和java(就像一只黑猩猩)一样,需要考虑一些重要的事情。首先,如果你让翻译失败,你的节目就会熄灯!并没有让我开始处理并发问题!此外,还有分配锅炉,我相信我找到了最好的配置,以尽量减少这个锅炉,但它仍然是分配!那么如何解决这个问题:考虑到C ++是你的中间人,你的对象实际上是c ++对象!好,你现在知道了。只需将您的对象编写为cpp中的程序,而不是使用您希望从两个世界访问的数据。然后你可以使用名为swig的包装器生成器([http://www.swig.org/Doc1.3/Java.html)]使java可以访问它并编译一个你称之为System.load的dll(这里的dll名称) )在java中。首先让这个工作,然后继续努力!要进入python,您需要嵌入一个解释器。首先,我建议做一些hello解释程序或本教程在C / C中嵌入python。一旦你有了工作,就有时间让马和猴子跳舞!您可以通过[boost] [3]将c ++对象发送给python。我知道我没有给你鱼,只是告诉你在哪里找到鱼。编译时需要注意的一些指示。


编译boost时,需要编译共享库。 你需要在jdk中包含和链接你需要的东西,即jawt.lib,jvm.lib,(启动应用程序时你的路径中还需要客户端jvm.dll)以及python27.lib或者 无论如何以及boost_python-vc100-mt-1_55.lib。然后包括Python / include,jdk / include,boost和仅使用共享库(dll),否则boost有一个teary。 我知道,是的。 有很多方法可以解决这个问题。 因此,请确保逐块完成每件事。 然后把它们放在一起。


回答: 2022-02-23 09:55

首先,如果你让翻译失败,你的节目就会熄灯!并没有让我开始处理并发问题!

此外,还有分配锅炉,我相信我找到了最好的配置,以尽量减少这个锅炉,但它仍然是分配!那么如何解决这个问题:考虑到C ++是你的中间人,你的对象实际上是c ++对象!好,你现在知道了。只需将您的对象编写为cpp中的程序,而不是使用您希望从两个世界访问的数据。

然后你可以使用名为swig的包装器生成器([http://www.swig.org/Doc1.3/Java.html)]使java可以访问它并编译一个你称之为System.load的dll(这里的dll名称) )在java中。首先让这个工作,然后继续努力!要进入python,您需要嵌入一个解释器。首先,我建议做一些hello解释程序或本教程在C / C中嵌入python。

相关问题推荐

  • 回答 156

    对于每一位才开始接触JAVA的新手来说,先不要管算法和数据结构,大多数简单的程序不需要用到算法和数据结构,所以当你真正需要时再去学习。编程一段时间以后,你就会知道在哪些地方用到他们。这时知道算法的名字并了解它们的功能,然后动手去实践。当我们在去...

  • 回答 93

    2个都很好就业,更关键的是要学得到东西

  • 回答 12
    已采纳

    获取Map集合中所有的key可以通过map集合的keySet()方法获取例如:    Map map = new HashMap();    map.put(xx,xx); //存放数据    //.... 省略    Set set = map.keySet();    //可以通过迭代器进行测试    Iterator iter = set.iter...

  • 回答 56
    已采纳

    不同年龄,不同掌握程度,学历,找工作城市,面试能力这是一个多方面影响的结果,如果是平均值的话,全国平均薪资14k左右

  • 回答 38

    具体学多久,根据自己的学习力,自律性、解决问题能力来决定若系统性学习,跟着讲师的节奏走,大概半年左右,有专业的讲师把课程进行规划,尽心系统学习,有问题,讲师会帮忙解决,学习的效率很高,避免了自学中出现各种问题解决不了,而耽误很多时间,可能会...

  • BIO与NIO、AIO的区别2020-05-19 15:59
    回答 4
    已采纳

    IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。一、BIO     在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要...

  • 回答 23
    已采纳

    (1)idea启动时会有两个快捷方式,安装完后默认生成在桌面的是32位的idea的快捷方式,如果我们使用这个快捷方式运行大项目,一般都会很卡。解决方法是找到idea的安装目录,然后进入bin文件夹,找到名称为idea64的应用程序,右键他生成桌面快捷方式。以后每次...

  • Java方法的命名规则2021-04-06 19:07
    回答 31

    ava是一种区分字母的大小写的语言,所以我们在定义变量名的时候应该注意区分大小写的使用和一些规范,接下来我们简单的来讲讲Java语言中包、类、变量等的命名规范。(一)Package(包)的命名Package的名字应该都是由一个小写单词组成,例如com、xuetang9、compan...

  • 回答 2

    public class Point {    private int x;    private int y;    public int getX() {        return x;    }    public void setX(int x) {        this.x = x;    }    public int getY() {        return y;    } ...

  • 回答 6

    经典版单例模式public class Singleton {        private static Singleton uniqueInstance;//利用一个静态常量来记录singleton类的唯一实例。     private Singleton() {     }     public static  Singleton getInstance()...

  • 回答 3

    哈希表的长度一般是定长的,在存储数据之前我们应该知道我们存储的数据规模是多大,应该尽可能地避免频繁地让哈希表扩容。但是如果设计的太大,那么就会浪费空间,因为我们跟不用不到那么大的空间来存储我们当前的数据规模;如果设计的太小,那么就会很容易发...

  • 回答 14

    1. DOM(Document Object Model)        DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才...

  • 回答 19

    1)作用不同: throw用于程序员自行产生并抛出异常; throws用于声明在该方法内抛出了异常2) 使用的位置不同: throw位于方法体内部,可以作为单独语句使用; throws必须跟在方法参数列表的后面,不能单独使用。3)内容不同: throw抛出一个异常对象,且只能是...

  • 回答 11

    基本执行过程如下:1)程序首先执行可能发生异常的try语句块。2)如果try语句没有出现异常则执行完后跳至finally语句块执行;3)如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理。4)catch语句块可以有多个,分别捕获不同类型...

  • 回答 20

    100-199 用于指定客户端应相应的某些动作。 200-299 用于表示请求成功。 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 400-499 用于指出客户端的错误。 400 语义有误,当前请求无法被服务器理解。 401 当前请求需要用户验证...

  • 回答 16

    异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java编译...

没有解决我的问题,去提问