私はcshスクリプトをpythonスクリプトに変換しています。このスクリプトは、非常に大きなスタックを必要とするメモリ集約型の実行可能ファイルを呼び出すため、cshスクリプトはスタックサイズを無制限に設定します。
limit stacksize unlimited
このスクリプトをpythonで再現しようとすると、os.system
を使用して、非常に素朴な方法でスクリプトを実行します。例:
os.system('some_executable')
しかし、これらの実行可能ファイルを無制限のスタックサイズで実行するようにOSに指示する方法がわかりません。 pythonスクリプト内の呼び出しにスタックサイズを指定する方法はありますか?使用する必要がある低レベルのシステム呼び出しはありますか?これを制御するモジュール(shutilに類似)があります?
必要に応じて、シェルの(u)limitコマンドを使用できます。
os.system('ulimit -s unlimited; some_executable')
または(おそらくより良い) resource.setrlimit を使用します:
resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))
私は次のコードで良い経験をしています。特別なユーザー権限は必要ありません:
import resource, sys
resource.setrlimit(resource.RLIMIT_STACK, (2**29,-1))
sys.setrecursionlimit(10**6)
ただし、pypyでは機能しないようです。
Python setrlimit インターフェイス、_resource.RLIMIT_STACK
_を探しています。
標準ユーザーはハード制限を上げることができないことに注意してください。ルート(まあ、_CAP_SYS_RESOURCE
_機能を持つプロセス(capabilities(7)を参照)だけが制限を上げることができるので、PAM pam_limits(8)を使用する必要があるかもしれませんlimits.conf(5)
ファイルを使用して、問題のユーザーのハード制限を引き上げます。
thread.stack_size
を使用して現在のプロセスのスタックサイズを変更できますが、それがサブプロセスによって正しく継承されるかどうかはわかりません。このインターフェイスには特定のスタックサイズも必要です。「無制限」はオプションではありません。