在Python中捕获node命令的输出

时间:2018-03-07 19:12:32

标签: javascript node.js python-3.x subprocess

我有一个javascript文件,我在终端

中使用node命令运行

jstest.js

var args = process.argv.slice(2);
console.log(args[0]);

var jsonata = require("jsonata");

var data = JSON.parse(args[0]);
var expression = jsonata(args[1]);
var result = expression.evaluate(data);
console.log(result);

在终端

node jstest3.js '{"example": [{"value": 2},{"value": 4},{"value": 5}]}' '$sum(example.value)'

现在我需要通过Python运行这个命令。所以我使用Python的子进程模块来完成任务

import subprocess
result = subprocess.run(['node', 'jstest3.js', '{"example": [{"value": 2},{"value": 4},{"value": 5}]}', '$sum(example.value)'])
print(result)

但我得到三个值作为输出

{"example": [{"value": 2},{"value": 4},{"value": 5}]}
11
CompletedProcess(args=['node', 'jstest3.js', '{"example": [{"value": 2},{"value": 4},{"value": 5}]}', '$sum(example.value)'], returncode=0)

但我只想要值 11 。我在文档中查找并尝试了以下技巧

result = subprocess.run(['node', 'jstest3.js', '{"example": [{"value": 2},{"value": 4},{"value": 5}]}', '$sum(example.value)'], stdout=subprocess.PIPE)
print(result.stdout)

b'{"example": [{"value": 2},{"value": 4},{"value": 5}]}\n11\n'


result = subprocess.call(['node', 'jstest3.js', '{"example": [{"value": 2},{"value": 4},{"value": 5}]}', '$sum(example.value)'])
print(result)

{"example": [{"value": 2},{"value": 4},{"value": 5}]}
11
0

如何仅获取 11

的表达式的结果

2 个答案:

答案 0 :(得分:1)

您可以通过调用check_output以字节顺序获取程序的输出,并将其拆分为' \ n'提取输出。要仅获取输出,可以对数组进行切片以删除args。

import subprocess

output = subprocess.check_output([
    'node', 'jstest.js',
    '{"example": [{"value": 2},{"value": 4},{"value": 5}]}',
    '$sum(example.value)'
])

# capture all the logged lines from the node process    
result = output.split(b'\n')[1:-1]
for line in result:
    print(line.decode('utf-8'))

# output
11

答案 1 :(得分:0)

您可以拆分结果字符串并在返回码(0)之前获取最后一个stdout行(11)

import subprocess

output = subprocess.check_output([
    'node', 'jstest.js',
    '{"example": [{"value": 2},{"value": 4},{"value": 5}]}',
    '$sum(example.value)'
])

result = output.split('\n')[-2]