在Python脚本中设置栈大小

48 投票
4 回答
63427 浏览
提问于 2025-04-16 12:11

我正在把一个csh脚本转换成python脚本。这个脚本会调用一个需要大量内存的可执行文件,而这个可执行文件需要一个非常大的栈,所以csh脚本把栈大小设置为无限:

limit stacksize unlimited

当我尝试用python重现这个脚本时,我的做法很简单,直接用 os.system 来执行,比如:

os.system('some_executable')

但是我不知道怎么告诉操作系统以无限的栈大小来运行这些可执行文件。在python脚本中,有没有办法指定栈大小?我需要使用某种低级的系统调用吗?或者有没有类似于shutil的模块可以控制这个?

4 个回答

14

你在找Python的setrlimit接口,具体是resource.RLIMIT_STACK

需要注意的是,普通用户不能提高他们的硬限制,只有超级用户(也就是root用户)或者拥有CAP_SYS_RESOURCE权限的进程才能提高这些限制;所以你可能需要使用PAM的pam_limits(8) limits.conf(5)文件来为相关用户提高硬限制。

20

如果你想的话,可以直接使用你命令行里的 (u)limit 命令:

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

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

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

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

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

不过,这段代码似乎在pypy上不太好使。

如果 resource.setrlimit 不管用,你也可以试试使用线程:

sys.setrecursionlimit(10**6)
import threading
threading.stack_size(2**26)
threading.Thread(target=main).start()

撰写回答