Установка размера стека в скрипте Python - PullRequest
23 голосов
/ 21 февраля 2011

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

limit stacksize unlimited

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

os.system('some_executable')

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

Ответы [ 4 ]

19 голосов
/ 27 апреля 2013

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

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

Однако, похоже, он не работает с pypy.

18 голосов
/ 21 февраля 2011

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

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

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

resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))
11 голосов
/ 21 февраля 2011

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

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

3 голосов
/ 21 февраля 2011

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

...