当前位置: 首页 > 知识库问答 >
问题:

我需要知道如何执行python shell comand并获得恒定输出

欧阳昊焱
2023-03-14

(对不起,我的英语不好),我正在制作一个魔镜,我正在开发一个模块。我用python做了一个脚本,我需要打印脚本的shell,因为它是一个“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”(只有一个序列),那么它可以工作,只有在我的脚本没有定义的情况下才可以工作

共有1个答案

齐高寒
2023-03-14

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

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

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

var self = this

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

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

或者简单地使用生成子进程的阻止版本:https://nodejs.org/api/child_process.html#child_process_child_process_spawnsync_command_args_options,应该简单得多

 类似资料:
  • 问题内容: 我想从Go执行perforce命令行“ p4”以执行登录工作。“ p4登录”要求用户输入密码。 如何在Go中运行需要用户输入的程序? 以下代码不起作用。 问题答案: 从os / exec.Command文档: 在执行命令之前,设置命令的Stdin字段。

  • 我想知道在不运行require的情况下,节点的require将解析到什么路径。 例如 在内部node.js将查看它的PATH,弄清楚它是一个目录、一个js文件、一个json文件等。,然后加载文件。 有没有办法在不实际加载模块的情况下只处理完整解析的路径? 我正在寻找的输出是这样的 重要的部分是. js扩展名,因为节点必须完全解析路径。 注意:无法解决此问题。如果some_module实际上是一个包

  • 问题内容: 我是新手,所以请保持温柔。 因此,我已经在某些代码中使用互斥锁了几周了。我了解其背后的概念:锁定对特定资源的访问权限,与之交互(读或写),然后为其他人再次解锁。 我使用的互斥锁代码主要是复制粘贴调整。该代码可以运行,但是我仍在努力解决其内部问题。到目前为止,我一直在结构中使用互斥锁来锁定该结构。今天,我发现了这个例子,这使我完全不清楚互斥锁实际上是在锁定什么。以下是一段示例代码: 让我

  • 使用rendered并不能保证 dispatchAction成功执行。 换为 setTimeout(() => {}, 1000); 才行。 如何才能确认什么时候满足执行 dispatchAction的条件呢?

  • 我从一些教程网站上了解到,如果我们想将Cucumber集成到我们的SeleniumJava项目中,我们需要下载所有这些jar文件并将其添加到项目中: cucumber核 cucumber-爪哇 cucumber-jUnit cucumber-jvm-deps cucumber-报告 小cucumber jUnit mockito-所有 cobertura 我的问题,有没有官网链接告诉我们需要什么j

  • 当我们讨论使用Executors服务处理异步事件时,为什么创建一个新的固定线程池涉及到使用LinkedBlockingQueue?到达的事件完全不依赖,所以为什么要使用队列,因为使用者线程仍然会涉及take Lock的争用?为什么Executors类没有一些混合数据结构(例如并发映射实现),在大多数情况下不需要带锁?