我正在将csh脚本转换为python脚本。该脚本调用内存密集型可执行文件,需要非常大的堆栈,因此csh脚本将stacksize设置为无限制:
limit stacksize unlimited
当我尝试在python中重现这个脚本时,我使用os.system
以非常幼稚的方式执行它们,例如:
os.system('some_executable')
但我不知道如何告诉操作系统使用无限制的堆栈大小来运行这些可执行文件。有没有办法为python脚本中的调用指定stacksize?是否有一些我应该使用的低级系统调用?是否有一个模块(类似于shutil)来控制它?
答案 0 :(得分:18)
我对以下代码有很好的经验。它不需要任何特殊的用户权限:
import resource, sys
resource.setrlimit(resource.RLIMIT_STACK, (2**29,-1))
sys.setrecursionlimit(10**6)
然而它似乎与pypy无关。
答案 1 :(得分:17)
如果需要,您可以使用shell的(u)limit命令:
os.system('ulimit -s unlimited; some_executable')
或(可能更好)使用resource.setrlimit:
resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))
答案 2 :(得分:10)
您正在寻找Python setrlimit界面resource.RLIMIT_STACK
。
请注意,标准用户无法提高其硬限制,只有root(具有CAP_SYS_RESOURCE
功能的进程(请参阅功能(7))进程可以提高其限制;因此您可能需要使用PAM pam_limits (8)limits.conf(5)
文件提高有关用户的硬限制。
答案 3 :(得分:2)
您可以通过thread.stack_size
更改当前进程的堆栈大小,但我不知道子进程是否会正确继承它。该接口还需要特定的堆栈大小 - “无限制”不是一种选择。