在python脚本中设置stacksize

mar*_*ard 25 python stack csh

我正在将csh脚本转换为python脚本.该脚本调用内存密集型可执行文件,需要非常大的堆栈,因此csh脚本将stacksize设置为unlimited:

limit stacksize unlimited
Run Code Online (Sandbox Code Playgroud)

当我尝试在python中重现这个脚本时,我以一种非常天真的方式执行它们os.system,例如:

os.system('some_executable')
Run Code Online (Sandbox Code Playgroud)

但我不知道如何通过无限制的堆栈大小来告诉操作系统运行这些可执行文件.有没有办法为python脚本中的调用指定stacksize?是否有一些我应该使用的低级系统调用?是否有一个控制它的模块(类似于shutil)?

Tho*_*hle 21

我对以下代码有很好的经验.它不需要任何特殊的用户权限:

import resource, sys
resource.setrlimit(resource.RLIMIT_STACK, (2**29,-1))
sys.setrecursionlimit(10**6)
Run Code Online (Sandbox Code Playgroud)

然而它似乎与pypy无关.

  • 如果溢出堆栈,`sys.setrecursionlimit(10**6)`会使Python解释器发生段错误. (3认同)
  • @ThomasAhle 什么是“-1”?您的意思是“resource.RLIM_INFINITY”吗? (3认同)
  • 请注意,截至目前,资源模块不适用于Windows操作系统. (2认同)

Nic*_*ley 18

如果需要,您可以使用shell的(u)limit命令:

os.system('ulimit -s unlimited; some_executable')
Run Code Online (Sandbox Code Playgroud)

或者(可能更好)使用resource.setrlimit:

resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))
Run Code Online (Sandbox Code Playgroud)


sar*_*old 11

你正在寻找Python setrlimit接口resource.RLIMIT_STACK.

请注意,标准用户无法提高其硬限制,只有root(具有该CAP_SYS_RESOURCE功能的进程(请参阅capabilities(7))进程可以提高其限制;因此您可能需要使用PAM pam_limits(8)limits.conf(5)文件来提高有问题的用户的限制.