web-dev-qa-db-fra.com

Réglage Stacksize dans A python Script

Je convertis d'un script csh en un python Script. Le script appelle une exécutable intensive de mémoire qui nécessite une très grande pile, le script CSH définit donc l'empilement sur illimité:

limit stacksize unlimited

Lorsque j'essaie de reproduire ce script en python, je les exécute de manière très naïve, en utilisant os.system, par exemple.:

os.system('some_executable')

Mais je ne sais pas comment dire au système d'exploitation d'exécuter ces exécutables avec une empilement illimité. Existe-t-il un moyen de spécifier Stacksize pour les appels dans A python Script? Existe-t-il un appel de système de bas niveau que je devrais utiliser? Et y a-t-il un module (semblable à Shuttilis) qui contrôle ceci ?

25
marshall.ward

Vous pouvez simplement utiliser la commande (U) limite de votre coquille, si vous voulez:

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

Ou (probablement mieux) utiliser ressources.setrlimit :

resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))
18
Nicholas Riley

J'ai une bonne expérience avec le code suivant. Il ne nécessite aucune autorisation d'utilisateur spéciale:

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

Cela ne semble cependant pas fonctionner avec Pypy.

21
Thomas Ahle

Vous recherchez le Python SETRLIMIT Interface, resource.RLIMIT_STACK.

Notez que les utilisateurs standard ne peuvent pas augmenter leurs limites dures, uniquement la racine (bien, un processus avec la capacité CAP_SYS_RESOURCE (voir les capacités (7)) Les processus peuvent augmenter leurs limites; vous devrez peut-être utiliser la PAM PAM_LIMITS (8) limits.conf(5) Fichier pour soulever les limites durs des utilisateurs en question.

11
sarnold

Vous pouvez modifier la taille de la pile du processus en cours via thread.stack_size , mais je ne sais pas si cela sera correctement hérité par des sous-processus. Cette interface nécessite également une taille de pile spécifique - "illimitée" n'est pas une option.

3
ncoghlan