2

我有一个简单的 Python GUI,它收集图像文件位置列表,传递给subproccessrun,它以 gimp-console exe 为目标以修改它们。在处理具有相当长目录的大量文件时,我发现Subprocess不再执行。

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

显然,虽然我可以围绕这个限制进行编程,但困扰我的是这个数字与我在这篇文章这里的另一篇文章中发现的限制非常不同。如第二篇文章的答案中所述,默认情况下,shell对于subprocess是关闭的。run,这应该给它最多 32,768 (接近我得到的 30 倍),并且为了确保我不会发疯,我明确地将shell设置为 False (可以预见,没有效果)。

我专门针对 GIMP 进行了一些搜索,但找不到任何相关信息。

所以,根据问题的标题:为什么我传递给子进程的最大命令行长度与我(大概)应该期待的如此不同?

由于 os 可能与它有关,因此我使用的是 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 未转移到 Script,因为该帖子上的问题是 args 丢失:compare-subprocess not execution to begin with due to length of args (ie- args 被接受并正确执行前提是运行命令的总长度在某个阈值以下)。该问题的解决方案是更改 python 文件扩展名或附加运行命令:比较 - 这篇文章运行非 python 可执行文件。

4

0 回答 0