我正在使用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])
}
});
答案 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-这没有限制。