在python脚本中设置stacksize

在python脚本中设置stacksize,python,stack,csh,Python,Stack,Csh,我正在将csh脚本转换为python脚本。该脚本调用内存密集型可执行文件,该文件需要非常大的堆栈,因此csh脚本将stacksize设置为unlimited: limit stacksize unlimited 当我尝试用python复制此脚本时,我会以非常简单的方式执行它们,使用os.system,例如: os.system('some_executable') 但我不知道如何告诉操作系统以无限的堆栈大小运行这些可执行文件。有没有办法在python脚本中为调用指定stacksize?是否有

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

limit stacksize unlimited
当我尝试用python复制此脚本时,我会以非常简单的方式执行它们,使用
os.system
,例如:

os.system('some_executable')

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

您正在寻找Python接口,
resource.RLIMIT\u STACK

请注意,标准用户无法提高其硬限制,只有root(嗯,具有
CAP\u SYS\u资源
功能的进程(请参阅功能(7))进程可以提高其限制;因此您可能需要使用PAM PAM\u limits(8)
limits.conf(5)
文件为相关用户提高硬限制。

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

os.system('ulimit -s unlimited; some_executable')
或者(可能更好)使用:


您可以通过更改当前进程的堆栈大小,但我不知道子进程是否会正确继承。该接口还需要特定的堆栈大小-“无限”不是选项。

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

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

但是,它似乎不适用于pypy。

第一个选项对我不起作用;我相信这是因为os.system在基本shell sh中执行命令,而不是bash或tcsh。但您的第二个选项正是我需要的,谢谢。(我不知道是谁首先建议了
setrlimit
,所以我授予这一个,因为它包含了显式代码。不过,我很感谢每个人的回答)。是的,我应该提到这一点——一些shell使用limit,一些使用ulimit,一些两者都允许;显式调用是一个更好的主意。
sys.setrecursionlimit(10**6)如果堆栈溢出,则
将使Python解释器出错。请注意,到目前为止,资源模块不适用于Windows操作系统。@ofer.sheffer仍然比使用
OS.system
@ThomasAhle I am
的公认答案要好。没有名为resource的模块
请尝试安装它。我有资源e模块试图在修正后设置
rlimit_堆栈
,可能会导致失败或相关问题。另请参见Red Hat
import resource, sys
resource.setrlimit(resource.RLIMIT_STACK, (2**29,-1))
sys.setrecursionlimit(10**6)