如何使用python shell从Javascript向Python传递长度超过4000的参数

时间:2018-07-05 18:09:19

标签: javascript python

我正在使用node.js,electron.js,Vue.js和Python构建桌面应用程序。我正在使用python进行打印。我正在使用python-shell npm库(https://www.npmjs.com/package/python-shell)。从python我正在使用pywin32  和sys库以打印并获取我从JavaScript代码传递的参数。在我的JavaScript代码中,我做了如下操作,我的输出有4000多个字符。我要打印的字符串。但并非所有行都已打印。传递值时是否有字符限制?如果是这样,我怎么知道极限,有人可以建议我做一个更好的方法

const PythonShell = require("python-shell");

var options = {          
        pythonOptions: ['-u'],
        scriptPath: __dirname,
        args: [printerName, output, imgPath]
};

PythonShell.run("../../../../extras/script/printer.py", options, function (err, results) {
    if (err) throw err;
    for(var k in results){
        console.log(results[k])
    }              
});

2 个答案:

答案 0 :(得分:1)

命令行的最大大小取决于您的操作系统(可能还有您的设置)。 1 该命令行必须足以容纳Python解释器和脚本的名称。路径,-u以及所有(正确引用的)参数。在您的系统上可能是4096,因此当您拥有大约4000个字符的参数时,事情就会开始失败。

对此有两种通用解决方案。


首先,如果脚本通过遍历并独立处理参数来使用参数,就像许多Unix工具一样,您可以一次调用50个参数来重复调用它。这基本上是xargs用于庞大的参数列表的相同技巧。


第二,您可以更改脚本以从文件或标准输入(而不是从命令行参数)读取其输入。

您还没有向我们展示您的代码,但是可以说它看起来像这样:

import sys
for arg in sys.argv[1:]:
    print('arg:', arg)

您可以将其更改为此:

import sys
for line in sys.stdin:
    print('arg:', line, end='')

但是现在您必须更改主叫方。我不了解PythonShell,我的JS还是很生锈,但是从快速查看docs示例来看,它看起来应该像这样:

var options = {          
        pythonOptions: ['-u'],
        scriptPath: 'myscript.py',
};

myscript = new PythonShell(options);
var results = [];
myscript.on('message', function(message)) {
    results += [message];
}
for (var i in args) {
    myscript.send(args[i] + '\n');
}
myscript.end(function(err, code, signal) {    
    if (err) throw err;
    for (var k in results){
        console.log(results[k])
    }              
});

使用文件代替stdin非常相似。看起来像这样:

import sys
filename = sys.argv[1]
with open(filename) as f:
    for line in f:
        print('arg:', line, end='')

然后调用它更接近您的原始代码:

tempFile = new IDontRememberHowToSecurelyMakeATempFileInNode();
for (var i in args) {
    tempFile.write(args[i] + '\n');
}

var options = {          
    pythonOptions: ['-u'],
    scriptPath: __dirname,
    args: [tempFile.howeverYouGetTheFileName()]
};

PythonShell.run("../../../../extras/script/printer.py", options, function (err, results) {
    if (err) throw err;
    for(var k in results){
        console.log(results[k])
    }              
});

1。在Windows上,它比这更复杂。在某些版本中,命令行参数和环境变量集必须一起处于另一个限制下,UTF-16与8位输入的限制可能有所不同,如果您使用的是模仿POSIX样式的API的MSVCRT函数,而不是直接调用Windows API等。

答案 1 :(得分:0)

python-shell documentation中可以看到,可以使用pyshell.send()将数据发送到python stdin-这没有限制。

相关问题