Максимальная длина аргумента в командной строке подпроцесса / Gimp меньше ожидаемой

У меня есть простой графический интерфейс Python, который собирает список расположений файлов изображений, который передается в подпроцесс.run, которая нацелена на gimp-console exe, чтобы изменить их. Работая с большим количеством файлов с достаточно длинными каталогами, я обнаружил, что подпроцесс больше не выполняется.

Сокращение количества файлов и изменение каталога на корневом диске были индивидуально допустимыми решениями, что указывает на то, что проблема заключается в длине строки, передаваемой в подпроцесс. После дальнейшего тестирования используется подпроцесс.list2cmdline Я обнаружил, что это число находится где-то между 1124 и 1159 символами (казалось, достаточно небольшим диапазоном, чтобы я не пытался получить более точный результат).

Хотя я могу, очевидно, программировать вокруг этого ограничения, меня беспокоит то, что это число очень отличается от ограничений, которые я обнаружил в этом посте и другом посте здесь. Как отмечено в ответе на второй пост, оболочка для подпроцесса по умолчанию отключена.run, что должно дать ему максимум 32 768 (что примерно в 30 раз больше, чем у меня), и просто чтобы убедиться, что я не схожу с ума, я явно установил shell в False (как и ожидалось, безрезультатно).

Я провел некоторые поиски, касающиеся GIMP, но не смог найти какую-либо соответствующую информацию.

Итак, в заголовке вопроса: почему максимальная длина командной строки, которую я передаю подпроцессу, настолько отличается от того, что я (предположительно) должен ожидать?

Поскольку os может иметь к этому какое-то отношение, я работаю на Windows 10 64-bit. Кроме того, хотя код не должен быть проблемой, поскольку, как уже говорилось, он успешно работает с более короткими вызовами, я включил его для полноты:

##  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, аргументы не переданы в Script, так как проблема в этом посте заключалась в том, что аргументы были потеряны: сравнение - подпроцесс не выполняется с самого начала из-за длины аргументов (т.е. аргументы принимаются и выполняются правильно при условии, что общая длина команды запуска не превышает определенный порог). Решением для этого вопроса было изменение расширений файла python или добавление команды run: сравнивать - в этом посте запускается не-python исполняемый файл.

0 ответов

Другие вопросы по тегам