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 ?
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))
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.
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.
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.