<p>命令行有一个最大大小,这取决于您的操作系统(可能还取决于您的设置)。<sup>1</sup>该命令行必须足以容纳Python解释器的名称、脚本路径、<code>-u</code>和所有(正确引用的)参数。在你的系统上可能是4096,所以当你有大约4000个字符的参数时,事情就开始失败了。你知道吗</p>
<p>有两种解决办法。你知道吗</p>
<hr/>
<p>首先,如果脚本像许多Unix工具那样通过循环使用参数并独立地传递它们,那么您可以一次使用50个参数重复调用它。这与<a href="https://en.wikipedia.org/wiki/Xargs" rel="nofollow noreferrer">^{<cd2>}</a>用于大型参数列表的技巧基本相同。你知道吗</p>
<hr/>
<p>其次,可以将脚本更改为从文件或标准输入读取其输入,而不是从命令行参数读取。你知道吗</p>
<p>你还没有向我们展示你的代码,但假设它看起来是这样的:</p>
<pre><code>import sys
for arg in sys.argv[1:]:
print('arg:', arg)
</code></pre>
<p>您可以将其更改为:</p>
<pre><code>import sys
for line in sys.stdin:
print('arg:', line, end='')
</code></pre>
<p>但现在你必须改变主叫方。我不知道PythonShell,我的JS也很生疏,但是从docs的例子来看,它看起来应该是这样的:</p>
<pre><code>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])
}
});
</code></pre>
<hr/>
<p>使用文件而不是stdin非常相似。它看起来像这样:</p>
<pre><code>import sys
filename = sys.argv[1]
with open(filename) as f:
for line in f:
print('arg:', line, end='')
</code></pre>
<p>然后调用它更接近原始代码:</p>
<pre><code>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])
}
});
</code></pre>
<hr/>
<p><sub>1。在Windows上,它比这更复杂。在某些版本中,命令行参数和环境变量集必须在另一个限制下,UTF-16和8位输入的限制可能不同,如果您使用模拟POSIX风格API的MSVCRT函数而不是直接调用Windows API,则会有其他限制,等等。</sub></p>