我有一个简单的Python GUI,它收集了一个图像文件位置列表,它传递给 subproccess 。 run ,它以gimp-console exe为目标,以便修改它们。在处理大量具有相当长目录的文件时,我发现 Subprocess 不再执行。
减少文件数量并将目录更改为根驱动器都是单独有效的解决方案,这向我表明问题在于传递给Subprocess的字符串的长度是个问题。在使用子流程。 list2cmdline 进一步测试后,我发现这个数字介于1124到1159个字符之间(看起来像是一个足够小的范围,我没有尝试更精细结果)。
虽然我可以,显然是围绕这个限制进行编程,但令我困扰的是,这个数字与我在this post和another post here中发现的限制非常不同。正如第二篇文章的答案所述, shell 默认为子流程。运行关闭,最多应该为32,768(这几乎是我得到的30倍,为了确保我不会疯狂,我明确地将 shell 设置为False(可预见,没有效果)。
我专门搜索了有关GIMP的内容,但无法找到任何相关信息。
所以,根据问题的标题:为什么我传递给子进程的最大命令行长度与我(可能)应该期望的那么不同?
由于操作系统可能与它有关,我使用的是Windows 10 64位。此外,虽然代码不应该是一个问题,因为 - 如上所述 - 它确实成功运行较短的调用,我是为了完整性而包括它:
## multifiles is a comma-separated string of filelocations, which is parsed by the
## python-fu script
sub=subprocess.run(
['##System Path##\\gimp-console-2.8.exe',
'-i', '-b',
'(python-fu-al-multifile 1 "{multifiles}")'.format(multifiles=multifiles),
'-b', '(gimp-quit 1)'],
stderr=subprocess.PIPE,check=True,shell=False)
编辑:不是Python Script, args not transferred to Script的重复,因为该帖子上的问题是args丢失了:比较 - 子进程由于args的长度而没有执行开始(即 - 如果运行命令的总长度低于某个阈值,则接受并正确执行args。该问题的解决方案是更改python文件扩展名或附加run命令:compare-这篇文章运行非python可执行文件。