web-dev-qa-db-ja.com

pythonスクリプトでスタックサイズを設定する

私はcshスクリプトをpythonスクリプトに変換しています。このスクリプトは、非常に大きなスタックを必要とするメモリ集約型の実行可能ファイルを呼び出すため、cshスクリプトはスタックサイズを無制限に設定します。

limit stacksize unlimited

このスクリプトをpythonで再現しようとすると、os.systemを使用して、非常に素朴な方法でスクリプトを実行します。例:

os.system('some_executable')

しかし、これらの実行可能ファイルを無制限のスタックサイズで実行するようにOSに指示する方法がわかりません。 pythonスクリプト内の呼び出しにスタックサイズを指定する方法はありますか?使用する必要がある低レベルのシステム呼び出しはありますか?これを制御するモジュール(shutilに類似)があります?

25
marshall.ward

必要に応じて、シェルの(u)limitコマンドを使用できます。

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

または(おそらくより良い) resource.setrlimit を使用します:

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

私は次のコードで良い経験をしています。特別なユーザー権限は必要ありません:

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

ただし、pypyでは機能しないようです。

21
Thomas Ahle

Python setrlimit インターフェイス、_resource.RLIMIT_STACK_を探しています。

標準ユーザーはハード制限を上げることができないことに注意してください。ルート(まあ、_CAP_SYS_RESOURCE_機能を持つプロセス(capabilities(7)を参照)だけが制限を上げることができるので、PAM pam_limits(8)を使用する必要があるかもしれませんlimits.conf(5)ファイルを使用して、問題のユーザーのハード制限を引き上げます。

11
sarnold

thread.stack_size を使用して現在のプロセスのスタックサイズを変更できますが、それがサブプロセスによって正しく継承されるかどうかはわかりません。このインターフェイスには特定のスタックサイズも必要です。「無制限」はオプションではありません。

3
ncoghlan