请教一个 Java 获得 Python 执行结果的方法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
backfrw
V2EX    Java

请教一个 Java 获得 Python 执行结果的方法

  •  
  •   backfrw 2017-04-13 23:43:45 +08:00 7861 次点击
    这是一个创建于 3181 天前的主题,其中的信息可能已经有所发展或是发生改变。
    前段时间交了毕业设计的开题报告,本来打算就 java 写个网站,老师说不行,太简单,改报告。。。
    最后是 python 写爬虫,通过关键字爬取信息,存数据库,用 java 的 SSM 框架写个后台,从数据库获得关键字相关的信息展示在页面上,之前想的是关键字通过 java 存数据库, python 从数据库拿关键字爬网站,算是通过开题报告了

    等真正开始写才觉得不对,主要流程上 java 怎么在 python 结束后运行,就把自己想死机了。。。。

    长期潜水看 V2EX 学姿势,大佬们能不能讲讲怎么开发比较容易啊?
    目前是 python 小白,正在一边看教程一边写
    42 条回复    2017-05-20 11:41:43 +08:00
    pierre1994
        1
    pierre1994  
       2017-04-13 23:45:46 +08:00
    rpc
    backfrw
        2
    backfrw  
    OP
       2017-04-13 23:57:34 +08:00
    @pierre1994 好的,我去研究,谢谢大佬
    ChasYuan
        3
    ChasYuan  
       2017-04-14 00:14:49 +08:00 via Android
    感觉楼主和我毕设差不多啊。不会一个专业吧。。我都是用 Java 实现的
    backfrw
        4
    backfrw  
    OP
       2017-04-14 00:17:32 +08:00
    @ChasYuan 网络工程,,,应该不是一个专业吧
    casparchen
        5
    casparchen  
       2017-04-14 00:57:58 +08:00
    java 不该从数据库读数据么,应该和 python 没关系吧
    backfrw
        6
    backfrw  
    OP
       2017-04-14 01:16:48 +08:00
    @casparchen 但是没有 java 存的关键字, python 不知道爬什么,没有 python 爬的数据, java 不知道展示什么,似乎陷入了循环
    casparchen
        7
    casparchen  
       2017-04-14 01:36:49 +08:00
    @backfrw python 每隔 10 秒读一下数据库?
    Lpl
        8
    Lpl  
       2017-04-14 02:47:21 +08:00 via iPhone   1
    写一个 webhook , java 出现存储关键字的操作后,通过 hook 通知 python 关键字更新了
    NoAnyLove
        9
    NoAnyLove  
       2017-04-14 03:01:16 +08:00   1
    以前看过一种设计,为了尽量的解耦合,不同部分都是通过数据库进行数据交换,所以每个部分都要周期性地读取数据库,如果有了数据就执行,没有就继续睡大觉。好处是实现简单,而且各部分没有很强的依赖关系。虽然获取数据会有一定延迟,不过应该能满足需求。

    此外,也许可以试试 Pyro , Python 端提供远程对象调用,同时又 Java 和.net 端接口。我没用过,但是感觉应该能满足你的需求 https://pythonhosted.org/Pyro4/pyrolite.html
    Lpl
        10
    Lpl  
       2017-04-14 03:05:06 +08:00
    忘了说了,不建议你去用 rpc ,用 rpc 还得考虑协议、序列化的东西。对于你要实现的东西来说太重,并且没有意义。市面上比较常见的与语言无关的 rpc 框架是 gRPC 。

    大概跟你讲下,你使用 java 写个简单的存储操作,有个 web 端的界面,存储操作简称“操作 A ”。你用 Python 写个 post 类型的接口,这个接口简称“接口 B ”。

    当你发生操作 A 的时候,向接口 B 发送 POST 请求,这个请求的数据可以是你新增的标签。如果 B 接收到请求,那么就开始爬网站,然后写入数据库。有了数据后, Java 自然就可以拿数据出来做展示。这就相当于一个简单的钩子
    Lpl
        11
    Lpl  
       2017-04-14 03:07:37 +08:00   1
    这样子做的话能解耦,比如说:你有多台爬虫机,那么就会有多个接口。你可以把接口在 java 端写活,比如存储进数据库。当你 java 发生存储操作的时候,就向数据库中的这些接口发送请求。

    嗯,这样子也有利于你的功能扩展
    Cbdy
        12
    Cbdy  
       2017-04-14 08:17:13 +08:00 via Android   1
    java 在 python 结束后运行?
    python pyapp.py | java -jar japp.jar

    或者起一个 Java 主进程,当需要爬东西的时候由这个进程 fork 一个 python 进程跑爬虫, java 阻塞直到 python 进程返回,有兴趣的话还可以研究一下 jython
    wwqgtxx
        13
    wwqgtxx  
       2017-04-14 08:27:01 +08:00 via iPhone
    消息交互用 rabbitmq 来交互不就行了
    louzhumuyou
        14
    louzhumuyou  
       2017-04-14 08:41:03 +08:00
    @Lpl 同样推荐 webhook 。
    arischow
        15
    arischow  
       2017-04-14 08:43:48 +08:00 via iPhone
    redis
    zwl2012
        16
    zwl2012  
       2017-04-14 09:08:14 +08:00 via iPhone
    为什么不统一语言呢? JAVA 也可以做爬虫呀
    Finest
        17
    Finest  
       2017-04-14 09:32:52 +08:00   1
    数据库生成一个任务记录, python 完成后更新状态, java 轮询状态,这不就很简单了吗。
    数据库改为 redis 效率更高, 还可以通过 pub/sub 实时通知
    kimchan
        18
    kimchan  
       2017-04-14 09:34:50 +08:00
    本来就是两个独立服务. 用接口不是很简单吗?
    blackFool
        19
    blackFool  
       2017-04-14 09:48:42 +08:00
    kafka
    domty
        20
    domty  
       2017-04-14 09:54:29 +08:00
    没考虑过用消息队列解耦
    woostundy
        21
    woostundy  
       2017-04-14 10:14:43 +08:00   1
    拿 redis 做个消息队列呗。
    vjnjc
        22
    vjnjc  
       2017-04-14 10:19:33 +08:00   1
    简单的来说楼主是缺乏出发程序的时机,那这样就简单了。
    python 操作好了通过 http 访问 java 后台接口,反之亦然
    ipwx
        23
    ipwx  
       2017-04-14 10:22:29 +08:00   1
    restful api
    bk201
        24
    bk201  
       2017-04-14 10:25:17 +08:00
    我都觉得根本不需要数据库
    debuggerx
        25
    debuggerx  
       2017-04-14 10:51:38 +08:00   1
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;

    /**
    * Created by debuggerx on 17-2-14.
    */
    public class ImageLocalizationUtil {
    public static String ImageLocalization(String uploadpath , String content) {
    String res = "";
    try {
    String[] cmd = {"python", uploadpath + "/ImageLocalization.py" ,uploadpath + "/xiumi/", content};
    Process process = Runtime.getRuntime().exec(cmd);
    String line = null;

    InputStream is = process.getInputStream();

    BufferedReader reader = new BufferedReader(new InputStreamReader(is));

    while ((line = reader.readLine()) != null) {
    System.out.println(line);
    res += line;
    }
    //process.waitFor();
    is.close();
    reader.close();
    process.destroy();

    } catch (Exception e) {
    e.printStackTrace();
    }
    return res;
    }
    }

    我这个因为就在一台服务器上跑的,所以 java 调用 python 并阻塞就拉倒了。。
    或者直接用 linux 的 pipe 管道做通讯,直接重定向输入输出就很随意了。
    不同机器上最简单的就是 python 执行结束后 urllib 调一下 java 写的 web 接口了事
    backfrw
        26
    backfrw  
    OP
       2017-04-14 11:08:15 +08:00
    @Lpl @NoAnyLove @wwqgtxx @ipwx 谢谢大佬,感觉学到了新东西
    backfrw
        27
    backfrw  
    OP
       2017-04-14 11:12:10 +08:00
    @Cbdy @arischow @hand515 @vjnjc 谢谢啦,回头试试
    backfrw
        28
    backfrw  
    OP
       2017-04-14 11:14:51 +08:00
    @zwl2012 因为老师没给过
    backfrw
        29
    backfrw  
    OP
       2017-04-14 11:15:15 +08:00
    @debuggerx 谢谢大佬,学到了
    RFC2109
        30
    RFC2109  
       2017-04-14 11:18:31 +08:00   1
    从场景上来说,应该用消息队列。用 redis 的 pub sub 就可以了。
    linsist
        31
    linsist  
       2017-04-14 11:18:36 +08:00   1
    Java 拿到关键词后在数据库中新建记录,同时推送任务到消息队列,然后轮询数据库的记录状态;
    Python 常驻监听消息队列,拿到任务,解决,然后回写数据库的记录状态。不过这种方式毕设还行,到了生产估计就不够用了吧。

    感觉楼主只是没绕过那个弯,两者之间怎么形成一个工作流
    backfrw
        32
    backfrw  
    OP
       2017-04-14 11:24:42 +08:00
    @linsist 谢谢啦,看了这么多建议,已经转过来啦,感谢各位回答的大佬
    backfrw
        33
    backfrw  
    OP
       2017-04-14 11:26:38 +08:00
    @RFC2109 感谢建议,谢谢啦
    wyntergreg
        34
    wyntergreg  
       2017-04-14 12:36:10 +08:00
    消息队列
    简单来说, redis 的 list 就足够了
    哪那么多事啊还 rpc ,怎么不上套 hadoop 啊
    denonw
        35
    denonw  
       2017-04-14 15:39:59 +08:00
    mq 吧
    Ixizi
        36
    Ixizi  
       2017-04-14 16:23:49 +08:00
    楼上正解。
    Jackeriss
        37
    Jackeriss  
       2017-04-14 20:06:04 +08:00
    @zwl2012 不是应该说 Python 也可以写网站吗?做个毕设分分钟的事。
    wc951
        38
    wc951  
       2017-04-14 23:05:37 +08:00 via Android
    杀鸡用什么牛刀,写个 http 接口顶天了
    woshixiaohao1982
        39
    woshixiaohao1982  
       2017-04-15 13:50:01 +08:00
    序列化 mq 队列搞起
    breezeFP
        40
    breezeFP  
       2017-05-04 15:38:30 +08:00
    直接用 java 去爬不好吗,当年我就是用 java 的一个框架 webcollect (好像是这个名字)做的,挺简单
    kwdfmzhu
        41
    kwdfmzhu  
       2017-05-19 21:24:30 +08:00
    同样推荐使用 rabbitmq,java 和 python 都使用很方便
    zonghua
        42
    zonghua  
       2017-05-20 11:41:43 +08:00 via iPhone
    jython
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5331 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 05:51 PVG 13:51 LAX 21:51 JFK 00:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86