系统参数未返回节点中的预期值,child_process数据发送到节点应用程序中的python脚本

c9qzyr3d  于 2023-02-11  发布在  Python
关注(0)|答案(1)|浏览(105)

我有一个nodejs应用程序,正在使用child_process发送数据,以便在python脚本中运行,但是"sys.argv"只返回"script1.py",文件名,而不是我想发送给python的对象。
下面是我的nodejs:

app.get("/", (request, response) => {
    console.log('hi')
  var dataToSend;
  var nodeData = "jeff";
  console.log('breh')
  var obj = {obj1: image3v, obj2: image4v}
  const python = spawn('python', ['script1.py'], obj);
  console.log('welp')
  python.stdout.on('data', function (data) {
    dataToSend = data.toString();
  });
  
  python.stderr.on('data', data => {
    console.error(`stderr: ${data}`);
    console.log(data)
  })
  
  python.on('exit', (code) => {
    console.log('exited')
    console.log(dataToSend);
    //run new stuffhere
  });
})

我的网站script1.py:

import sys

print('python begins')
print(sys.argv[0])
print(sys.argv[0][1])
print(sys.argv[0][2])
print(sys.argv)
print(sys.orig_argv)

然而,python中的所有这些print语句都打印'script1.py'['script1.py'],或者通过[0][1]打印www.example.com中的一个字母,等等。如果我尝试执行sys.argv[1],我会得到超出边界的索引。script1.py via the [0][1] , etc. If I try to do sys.argv[1] , I get index out of bounds.
查看其他引用,我的代码应该可以工作,但是我认为有一些东西我没有看到。我不知道还有什么可以尝试访问该对象。
谢谢。

z6psavjg

z6psavjg1#

spawn一个外部命令并在命令行上传递参数,参数需要被序列化,例如,变成一个字符串。命令行参数的大小是有限制的,所以如果它们太大,必须使用一些其他的方法(例如,通过stdin/stdout、命名管道等传递)。
下面是一个从node到python传递参数的演示。
spawnSO.js

const { spawn } = require('node:child_process');

const params = {"fred": 1, "wilma": "wife", "dino": ["barks", 2.718]};

const python = spawn('python', ['spawned.py', JSON.stringify(params)]);

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

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

python.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

spawned.py

import sys

print(sys.orig_argv)
print("len(sys.argv): ", len(sys.argv))

for k, arg in enumerate(sys.argv):
  print(f"argv num: {k}, argv: {arg}")

import json

from_json_string = json.loads(sys.argv[1])
print(f"type of converted JSON: {type(from_json_string)}, loaded value: {from_json_string}")

下面是输出:

$ node spawnSO.js
stdout: ['python', 'spawned.py', '{"fred":1,"wilma":"wife","dino":["barks",2.718]}']
len(sys.argv):  2
argv num: 0, argv: spawned.py
argv num: 1, argv: {"fred":1,"wilma":"wife","dino":["barks",2.718]}
type of converted JSON: <class 'dict'>, loaded value: {'fred': 1, 'wilma': 'wife', 'dino': ['barks', 2.718]}

child process exited with code 0

相关问题