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

如何使用pythonshell将长度超过4000的参数从Javascript传递到Python,javascript,python,Javascript,Python,我正在使用node.js、electron.js、Vue.js和Python构建一个桌面应用程序。我正在使用python进行一些打印。我正在使用pythonshellnpm库()。在python中,我使用的是pywin32 和sys库来打印和获取我从JavaScript代码传递的参数。在我的JavaScript代码中,我做了如下操作,输出超过4000个字符。这是我要打印的字符串。但并不是所有的行都被打印出来。传递值时是否有字符限制?如果是这样的话,我如何知道限制,有人能给我一个更好的方法来做到这

我正在使用node.js、electron.js、Vue.js和Python构建一个桌面应用程序。我正在使用python进行一些打印。我正在使用pythonshellnpm库()。在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个参数。这与大型参数列表使用的技巧基本相同


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

您尚未向我们展示您的代码,但假设它看起来是这样的:

import sys
for arg in sys.argv[1:]:
    print('arg:', arg)
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='')
您可以将其更改为:

import sys
for line in sys.stdin:
    print('arg:', line, end='')
但现在你必须改变主叫方。我不知道PythonShell,我的JS也很生疏,但从docs示例来看,它看起来应该是这样的:

import sys
for arg in sys.argv[1:]:
    print('arg:', arg)
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='')

使用文件而不是stdin是非常相似的。它看起来像这样:

import sys
for arg in sys.argv[1:]:
    print('arg:', arg)
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])
    }              
});


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

如中所示,您可以使用
pyshell.send()
将数据发送到python stdin-这没有限制。

命令行限制是特定于操作系统的,因为您使用的是Windows,请参阅。另请参阅已接受的答案,以感谢您的支持。我知道windows命令行参数有限制,但是有没有其他方法可以使用java脚本将如此长的字符串发送到python脚本?使用标准流(
stdin
/
stdout
)并使用管道传递,匿名或命名,具体取决于进程之间的关系。我使用了write-to-file方法。但我还是有同样的问题。下面是我的python代码的一些部分。我检查了临时文件,它有我需要打印的完整字符串。但在打印机中,它会在某个点停止
printer_name=sys.argv[1]filename=sys.argv[2]image_path=sys.argv[3]pointSize=int(sys.argv[4])bill_format=“”,打开(文件名)为f:f中的行:bill_format+=line
hDC=win32ui.CreateDC()hDC.CreatePrinterDC(打印机名称)可打印区域=hDC.GetDeviceCaps(HORZRES)、hDC.GetDeviceCaps(VERTRES)打印机大小=hDC.GetDeviceCaps(PHYSICALWIDTH),hDC.GetDeviceCaps(PHYSICALHEIGHT)打印机边距=hDC.GetDeviceCaps(PHYSICALOFFSETX),hDC.GetDeviceCaps(PHYSICALOFFSETY)
hDC.StartDoc(图像路径)hDC.StartPage()Y=20如果图像路径!=“”:x1=int((打印机大小[0]-打印机边距[0]/2)-徽标宽度)/2)x2=int(x1+徽标宽度)`y1=int(打印机大小[1]/150)y2=int(y1+徽标高度)dib.draw(hDC.GetHandleOutput(),(x1,y1,x2,y2))Y=y2+Y hDC.SetMapMode(win32con.MM\u文本)用于行输入(票据格式).split(“\n”):hDC.TextOut((打印机页边空白[0]+行间距),Y,行)Y+=int(行间距*1.25)hDC.EndPage()hDC.EndDoc()hDC.DeleteDC()`