Python 子进程/Gimp命令行批处理最大参数长度比预期短

Python 子进程/Gimp命令行批处理最大参数长度比预期短,python,subprocess,gimp,python-fu,Python,Subprocess,Gimp,Python Fu,我有一个简单的Python GUI,它收集图像文件位置的列表,并传递给subaccess.run,它以gimp控制台exe为目标来修改它们。在处理大量具有相当长目录的文件时,我发现子进程不再执行 减少文件数量和将目录更改为根驱动器都是各自有效的解决方案,这向我表明问题在于传递给子流程的字符串的长度。在使用子流程.list2cmdline进行进一步测试后,我发现这个数字介于1124到1159个字符之间(似乎是一个足够小的范围,我没有尝试获得更精细的结果) 虽然我可以,很明显,围绕这个限制进行编程,

我有一个简单的Python GUI,它收集图像文件位置的列表,并传递给subaccess.run,它以gimp控制台exe为目标来修改它们。在处理大量具有相当长目录的文件时,我发现子进程不再执行

减少文件数量和将目录更改为根驱动器都是各自有效的解决方案,这向我表明问题在于传递给子流程的字符串的长度。在使用子流程.list2cmdline进行进一步测试后,我发现这个数字介于1124到1159个字符之间(似乎是一个足够小的范围,我没有尝试获得更精细的结果)

虽然我可以,很明显,围绕这个限制进行编程,但困扰我的是,这个数字与我在和中发现的限制非常不同。正如在第二篇文章的回答中所指出的,默认情况下,子进程的shell是关闭的,run应该给它一个最大值32768(接近我得到的值的30倍),为了确保我没有发疯,我显式地将shell设置为False(可以预见,没有效果)

我专门搜索了一些有关GIMP的信息,但找不到任何相关信息

那么,根据问题的标题:为什么我传递给子流程的最大命令行长度与我(大概)预期的不同

由于操作系统可能与此有关,我使用的是64位Windows 10。此外,虽然代码不应该是一个问题,因为——如上所述——它确实可以通过较短的调用成功运行,但出于完整性考虑,我将其包括在内:

##  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)

编辑:不是的副本,因为该帖子上的问题是args丢失:compare-由于args的长度,子流程开始时未执行(即,-args被正确接受并执行,前提是run命令的总长度低于某个阈值)。这个问题的解决方案是更改python文件扩展名或附加run命令:compare-这篇文章运行一个非python可执行文件。

您可以通过创建一个包含要处理的文件列表的临时文件并让Gimp脚本读取该文件来避免这个问题。此外,GUI python所做的任何事情都不能在Gimp python脚本中完成,因此如果您从某个选择参数(例如,某个目录下的所有内容)获取文件,然后,您的Gimp脚本可以接收选择参数并自行执行文件搜索。如果Gimp 2.10仍存在此情况,则最好将此文件归档,以便Gimp开发人员检查此问题。