Настройка 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
, но я не знаю, будет ли это правильно унаследовано подпроцессы. Этот интерфейс также требует определенного размера стека - "неограниченный" вариант не является.