Настройка stacksize в python script

Я конвертирую csh script в python script. script вызывает исполняемый файл с интенсивной памятью, для которого требуется очень большой стек, поэтому csh script устанавливает неограниченное количество стеков:

limit stacksize unlimited

Когда я пытаюсь воспроизвести этот script в python, я выполняю их очень наивно, используя os.system, например:

os.system('some_executable')

Но я не знаю, как сообщить ОС, чтобы запускать эти исполняемые файлы с неограниченным стекированием. Есть ли способ указать stacksize для вызовов внутри python script? Есть ли какой-то системный вызов низкого уровня, который я должен использовать? И есть ли модуль (похожий на shutil), который контролирует это?

Ответ 1

Вы можете просто использовать команду ограничения (u) вашей оболочки, если хотите:

os.system('ulimit -s unlimited; some_executable')

Или (возможно, лучше) используйте resource.setrlimit:

resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))

Ответ 2

У меня есть хороший опыт работы со следующим кодом. Он не требует специальных прав пользователя:

import resource, sys
resource.setrlimit(resource.RLIMIT_STACK, (2**29,-1))
sys.setrecursionlimit(10**6)

Однако он не работает с pypy.

Ответ 3

Вы ищете интерфейс Python setrlimit, resource.RLIMIT_STACK.

Обратите внимание, что стандартные пользователи не могут поднять свои жесткие ограничения, только root (ну, процесс с возможностями CAP_SYS_RESOURCE (см. возможности (7)) может повысить их пределы, поэтому вам может понадобиться использовать PAM pam_limits (8 ) limits.conf(5), чтобы повысить жесткие ограничения для пользователей.

Ответ 4

Вы можете изменить размер стека текущего процесса с помощью thread.stack_size, но я не знаю, будет ли это правильно унаследовано подпроцессы. Этот интерфейс также требует определенного размера стека - "неограниченный" вариант не является.