51

I am converting a csh script to a python script. The script calls a memory-intensive executable which requires a very large stack, so the csh script sets the stacksize to unlimited:

limit stacksize unlimited

When I try to reproduce this script in python, I execute them in a very naive manner, using os.system, e.g.:

os.system('some_executable')

But I do not know how to tell the OS to run these executables with unlimited stacksize. Is there a way to specify stacksize for calls within a python script? Is there some low-level system call that I should be using? And is there a module (similar to shutil) which controls this?

1
  • Attempting to set rlimit_stack after Stack Clash remediations may result in failure or related problems. Also see Red Hat Issue 1463241 Commented Jun 21, 2017 at 16:21

4 Answers 4

56

I have good experience with the following code. It doesn't require any special user permissions:

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

It does however not seem to work with pypy.

If resource.setrlimit doesn't work, you can also try using threads:

sys.setrecursionlimit(10**6)
import threading
threading.stack_size(2**26)
threading.Thread(target=main).start()
Sign up to request clarification or add additional context in comments.

6 Comments

sys.setrecursionlimit(10**6) will make the Python interpreter segfault if you overflow the stack.
Note that, as of this moment, the resource module is not available for Windows OS.
@ofer.sheffer Still better than the accepted answer which uses os.system.
@ThomasAhle I am getting the error no module named resource
@ThomasAhle what is the -1? Did you mean resource.RLIM_INFINITY?
|
20

You can just use the (u)limit command of your shell, if you want:

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

Or (probably better) use resource.setrlimit:

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

2 Comments

The first option doesn't work for me; I believe it is because os.system executes commands in the basic shell, sh, rather than bash or tcsh. But your second option is exactly what I needed, thank you. (I can't tell who suggested setrlimit first so I am awarding this one, since it includes the explicit code. I am grateful for everyone's answers, though).
Yeah, I should have mentioned that - some shells use limit, some use ulimit, some allow both; the explicit invocation is a much better idea.
15

You're looking for the Python setrlimit interface, resource.RLIMIT_STACK.

Note that standard users cannot raise their hard limits, only root (well, a process with the CAP_SYS_RESOURCE capability (see capabilities(7)) processes can raise their limits; so you may need to use the PAM pam_limits(8) limits.conf(5) file to raise the hard limits for the users in question.

Comments

5

You can alter the stack size of the current process via threading.stack_size(), but I don't know if that will be correctly inherited by subprocesses. That interface also requires a specific stack size - "unlimited" isn't an option.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.