如何使用pythonsh将长度超过4000的参数从Javascript传递到Python

2024-09-26 22:09:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用节点.js,电子.js,虚拟用户.js还有Python。我正在用python来打印。我正在使用pythonshellnpm库(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])
    }              
});

Tags: 代码用户https节点varwwwjs电子
2条回答

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

有两种解决办法。你知道吗


首先,如果脚本像许多Unix工具那样通过循环使用参数并独立地传递它们,那么您可以一次使用50个参数重复调用它。这与^{}用于大型参数列表的技巧基本相同。你知道吗


其次,可以将脚本更改为从文件或标准输入读取其输入,而不是从命令行参数读取。你知道吗

你还没有向我们展示你的代码,但假设它看起来是这样的:

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,则会有其他限制,等等。

正如您在python-shell documentation中所看到的,您可以使用pyshell.send()将数据发送到python stdin—这没有限制。你知道吗

相关问题 更多 >

    热门问题