javascript - 如何使用 python shell 将长度超过 4000 的参数从 Javascript 传递到 Python

标签 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])
    }              
});

最佳答案

命令行有最大大小,这取决于您的操作系统(可能还有您的设置)。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 也很生疏,但快速浏览一下文档示例,它看起来应该是这样的:

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])
    }              
});
<小时/>

使用文件而不是标准输入非常相似。它看起来像这样:

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 位输入的限制可能不同,如果您使用MSVCRT 函数模拟 POSIX 风格的 API,而不是直接调用 Windows API 等。

关于javascript - 如何使用 python shell 将长度超过 4000 的参数从 Javascript 传递到 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51197551/

相关文章:

python - 在 python 中取一个没有 numpy 或 pandas 的数组样本

python - 在 matplotlib python 中使用带有 tex 分数表达式的格式

python - 在 matplotlib.pyplot.figtext 中对齐列

javascript - 如何在位置 : n in div 插入新元素

javascript - 如果我需要保存 Backbone.Collection,这是代码味道吗?

javascript - jquery 触发器上调用了不正确的处理程序

python - 如何在 Python 中将表达式拆分为多行

javascript - 为什么 XMLHttpRequest ProgressEvent.lengthComputable 可能为假?

javascript - 使用正则表达式以逗号分隔但不在括号内

python - 在 python 中使用 re.sub 将 "&&"替换为 "and"。