V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jakeyfly
V2EX  ›  问与答

今天有个大佬告知用 Python 调用 nodejs 运行 js 脚本或代码 然后可以接收返回值 不知道咋实现

  •  
  •   jakeyfly · 2018-02-20 20:23:08 +08:00 · 9063 次点击
    这是一个创建于 2472 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大佬们有没有了解相关方面的 给个示例看看 好像是用 subprocess.Popen 来弄的 但是弄半天没成功

    20 条回复    2018-02-21 10:12:16 +08:00
    messense
        1
    messense  
       2018-02-20 21:12:33 +08:00
    jakeyfly
        2
    jakeyfly  
    OP
       2018-02-20 21:18:38 +08:00
    @messense 大佬 这个包跟 pyexec 那个比怎么样
    golmic
        3
    golmic  
       2018-02-20 21:20:44 +08:00 via Android
    最简单的方案,node 写文件,python 读
    jakeyfly
        4
    jakeyfly  
    OP
       2018-02-20 21:27:27 +08:00
    @golmic 是用于爬虫的 get Js 文件 返回回来的 想读取其中的变量值或者函数返回值 所以 能不能直接调用 node 跑 JS 或者 上面说的包
    zbl430
        5
    zbl430  
       2018-02-20 22:20:56 +08:00 via Android
    pip install pyexecjs
    golmic
        6
    golmic  
       2018-02-20 22:36:38 +08:00 via Android
    @jakeyfly 小段代码用 execjs,大段代码直接 node 跑
    ETiV
        7
    ETiV  
       2018-02-20 23:47:57 +08:00 via iPhone
    nodejs 里 console.log 输出“返回值”
    python 里读这个子进程的 stdout 内容
    jakeyfly
        8
    jakeyfly  
    OP
       2018-02-20 23:50:02 +08:00
    @ETiV 那是要先把请求回来的 JS 保存成文件吗 还是直接把 response 交给 nodejs 跑
    jakeyfly
        9
    jakeyfly  
    OP
       2018-02-20 23:50:40 +08:00
    @golmic 大佬有 demo 借鉴一下不
    ericls
        10
    ericls  
       2018-02-20 23:57:51 +08:00
    nodejs --> stdout --> python

    ```
    p = subprocess.run(['command'], stdout=subprocess.PIPE)
    res = p.stdout
    ```
    ETiV
        11
    ETiV  
       2018-02-20 23:59:04 +08:00 via iPhone
    哦 你是要下载别人的 js 运行
    headless browser 了解一下…

    nodejs 威力太大了,如果别人给你返回个删本地文件、或者开 ftp/shell 的 js 代码,就有趣了
    jakeyfly
        12
    jakeyfly  
    OP
       2018-02-21 00:20:25 +08:00
    @ETiV 无端浏览器 不适合我 太慢了 谢谢大佬
    jakeyfly
        13
    jakeyfly  
    OP
       2018-02-21 00:22:19 +08:00
    @ericls ['node','xx.js'] 老是提示我 文件或文件侠不存在 cwd=path 没有错 但是加上 shell=True 可以在终端上 python xxx.py 运行 不知道什么原因 晕了
    tolbkni
        14
    tolbkni  
       2018-02-21 01:22:37 +08:00 via Android
    @jakeyfly 提示是 node 不存在还是 xx.js 不存在?
    zythum
        15
    zythum  
       2018-02-21 01:28:32 +08:00
    @ETiV node 沙箱机制了解一下。 可以把执行代码拿出来当字符串用沙箱执行。require 不给他就行了。
    ericls
        16
    ericls  
       2018-02-21 01:32:29 +08:00 via iPhone
    @jakeyfly 如果你用相对路径 相对的是运行时的 cwd 而不是文件位置。 用 __file__ 组个绝对路径出来吧……

    如果是 node 不存在可以在运行前用 sys 改 path
    jakeyfly
        17
    jakeyfly  
    OP
       2018-02-21 01:59:45 +08:00
    @tolbkni 提示文件或目录不存在,然后后面跟着 node xxx.js 是否是 node 没有配置好的问题 我在 BASH 下运行是可以的就是 pycharm run 不行
    jakeyfly
        18
    jakeyfly  
    OP
       2018-02-21 02:14:22 +08:00
    @ericls 路径 我犯了一个低级错误 解决了 现在问题是 打印打出来的好像不全 ... 155 more items 如何全部的呢
    jakeyfly
        19
    jakeyfly  
    OP
       2018-02-21 02:22:23 +08:00
    还想请教一下 我这是要爬取别人的 JS 文件 运行后 提示其中的变量的值 比如 ARRAY 值 返回 PYTHON 用 现在不明白的地方有 1,用 node 返回值 是否只能这样流的形式通信 该怎么在请求的 js 文件里 加上 console.log 这样自己的代码,2,返回的好像是字符串,我刚才用 pyminirance 弄了一下 能直接获取数组之类 python 能用的数据类型。。。。这种用 NODE 跑的方式是不是不适合用来爬数据呀。。。。。。。
    golmic
        20
    golmic  
       2018-02-21 10:12:16 +08:00 via Android
    pydata.me 里面有模拟登录新浪微博的代码,用到了这个
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3027 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:39 · PVG 22:39 · LAX 06:39 · JFK 09:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.