【问题标题】:I need to know how to execute python shell comand and get constant output我需要知道如何执行 python shell 命令并获得恒定输出
【发布时间】:2021-04-29 15:01:01
【问题描述】:

(抱歉我的英语不好),我正在制作一个魔镜并为此开发一个模块。我在 python 中完成了一个脚本,我需要不断地打印脚本的外壳,因为它是“While True”。为此,我需要做一个子进程,但我的问题是:当我的脚本运行时,它不会在日志控制台或镜像中打印任何内容。

node_helper.js的文件--->

var NodeHelper = require("node_helper")
var { spawn } = require("child_process")

var self = this

async function aexec() {
        const task = spawn('python3', ['/Fotos/reconeixementfacial.py'])
        task.stdout.on('data', (data) => {
                console.log(`${data}`)
        })
        task.stdout.on('exit', (data) => {
                console.log("exit")
        })
        task.stdout.on('error', (data) => {
                console.log(`${error}`)
        })
        task.unref()
}

module.exports = NodeHelper.create({
        start: function() {
                aexec()
        },
        socketNotificationReceived: function(notification, payload) {
                console.log(notification)
        }
})

非常感谢您抽出宝贵的时间!! 注意:如果我的 python 脚本没有“while true”(只有一个序列),它可以工作,只有在我的脚本未定义时才有效

【问题讨论】:

    标签: javascript python magic-mirror


    【解决方案1】:

    Ofc 我不知道您如何使用导出的模块,但我假设您只是运行 start 函数来阻止您的进程,但正如文档所说 spawn 是异步的并且不会阻止循环并且您添加了异步函数这是一个承诺。

    因此,如果您希望它是异步的,您必须正确处理当前模块和所有其他调用它的承诺:

    var NodeHelper = require("node_helper")
    var { spawn } = require("child_process")
    
    var self = this
    
    function aexec() {
        return new Promise(function(resolve, reject) {
            let result = '';
            const task = spawn('python3', ['/Fotos/reconeixementfacial.py'])
            task.stdout.on('data', (data) => {
                    console.log(`${data}`)
                    result += data.toString() // accumulate
            })
            task.stdout.on('exit', (data) => {
                    console.log("exit")
                    task.unref()
                    resolve(result) // return from promise (async)
            })
            task.stdout.on('error', (data) => {
                    console.log(`${error}`)
                    task.unref()
                    reject()
            })
        });
    }
    
    module.exports = NodeHelper.create({
            start: function() {
                    aexec().then((result) => console.log(result))
            },
            socketNotificationReceived: function(notification, payload) {
                    console.log(notification)
            }
    })
    

    或者简单的使用阻塞版本生成子进程:https://nodejs.org/api/child_process.html#child_process_child_process_spawnsync_command_args_options 哪个应该更简单

    【讨论】:

    • 我需要的是在执行程序的同时获取程序的输出。使用这个的问题是,我只有在程序结束后才能得到输出。
    • 最简单的使用spawnSync 的方法没有任何进程let result = require('child_process').spawnSync('ls').stdout.toString() 而不是ls 你的命令。 stdout 的结果是字节流,必须解码为字符串
    • 我对使用这个 exec 作为 Sync 不感兴趣,我的想法是它是我父进程上的后台异步进程,并且它会持续运行一段时间(true),直到整个程序结束。我想要的是在不关闭 shell 命令或等待它结束的情况下获得此输出。
    • 然后使用我在答案中显示的promise,唯一的区别是如果您希望从函数返回结果将其传递给resolve函数,我将更新答案
    • 在这里我们得到了相同的结果。我需要的是在执行 Python 代码时获取日志:在 print() 方法完成的同时,我需要此消息。它就像一个服务器类,我不能等到它结束,我也不能结束进程,因为这不是这段代码的目的,因为我需要任何一种允许我在异步上获取输出的解决方案方式,而不必为此关闭进程。
    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 2021-09-10
    • 2014-06-29
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多