我正在使用 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/