首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用child_process (节点js)在后台运行python脚本

使用child_process (节点js)在后台运行python脚本
EN

Stack Overflow用户
提问于 2016-06-30 15:40:40
回答 2查看 2.2K关注 0票数 1

我在raspberry pi上有一个python脚本test.py,需要在后台运行。使用CLI,我这样做:

代码语言:javascript
运行
复制
python test.py &

但是,如何使用节点js中的child_process进行同样的操作。

代码语言:javascript
运行
复制
var spawn = require("child_process").spawn;
var process = spawn("python",["/path/to/test.py", "&"]);

我有这段代码,这似乎不起作用。请提出实现这一目标的可能方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-30 15:47:09

不要在命令行参数中使用& (符号)。它由shell使用,而不是python使用。

使用{detached: true}选项,这样它就能够在节点进程退出时存活:

代码语言:javascript
运行
复制
var spawn = require("child_process").spawn;
var p = spawn("python", ["/path/to/test.py"], {detached: true});

如果您还想要存储其输出,请使用{stdio: 'ignore'}

代码语言:javascript
运行
复制
var spawn = require("child_process").spawn;
var p = spawn("python", ["/path/to/test.py"], {detached: true, stdio: 'ignore'});

另外,我不会命名变量process,因为它是由节点使用的:

process对象是一个全局对象,它提供有关当前Node.js进程的信息并对其进行控制。作为一个全局工具,Node.js应用程序总是可以使用它,而不需要使用require()。

请参阅:流程

更新

如果它仍然没有退出,尝试添加:

代码语言:javascript
运行
复制
p.unref();

到您的程序,其中pspawn返回的

代码语言:javascript
运行
复制
var spawn = require("child_process").spawn;
var p = spawn("python", ["/path/to/test.py"], {detached: true, stdio: 'ignore'});
p.unref();

更新2

下面是一个shell会话示例--如何运行它,测试它是否工作并杀死它:

代码语言:javascript
运行
复制
$ cat parent.js 
var spawn = require("child_process").spawn;
var fs = require("fs");
var p = spawn("sh", ["child.sh"], {detached: true, stdio: 'ignore'});
p.unref();
$ cat child.sh 
#!/bin/sh
sleep 60
$ node parent.js 
$ ps x | grep child.sh
11065 ?        Ss     0:00 sh child.sh
11068 pts/28   S+     0:00 grep child.sh
$ kill 11065
$ ps x | grep child.sh
11070 pts/28   S+     0:00 grep child.sh
$ 
票数 1
EN

Stack Overflow用户

发布于 2016-06-30 15:49:16

你不应该这么做的。流程应该由真正的流程管理器来处理。

如果要运行后台进程,应该研究如何在Raspberry Pi中运行服务。这取决于运行在Raspberry Pi (新贵 (类似于Debian)或系统d (如CentOS))上的Linux发行版。

但是无论如何,引用文档的一个例子

代码语言:javascript
运行
复制
const spawn = require('child_process').spawn;
const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.log(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38127766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档