Pythonのsubprocess.runで長い引数を使うと、エラーが発生して実行できません。
そこで、手元のLinux環境で限界を調べてみました。 最初に引数の最大値を調べてみます。$ getconf ARG_MAX 2097152と表示されました。 次に、Python経由でコマンドを実行してみます。
subprocess.run(["echo", "a"*131071])はエラーが発生せずに動作しました。 一方、
subprocess.run(["echo", "a"*131072])だと、
<省略> File "/usr/lib/python3.9/subprocess.py", line 505, in run with Popen(*popenargs, **kwargs) as process: File "/usr/lib/python3.9/subprocess.py", line 951, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "/usr/lib/python3.9/subprocess.py", line 1823, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) OSError: [Errno 7] Argument list too long: 'echo'となり、長すぎというエラーが出ました。ARG_MAXの値よりもずいぶんと短い値でエラーになります。 複数の引数ならどうなるかを試してみます。
subprocess.run(["echo"]+["a"*131071]*15)はエラーが発生せずに動作しました。 runに渡した文字列長はリストの要素をスペース1個でつなげるとすると1966084バイトで、ARG_MAXを下回っています。 一方、
subprocess.run(["echo"]+["a"*131071]*16)だと先程と同じエラーが発生します。 この場合の文字列の長さは2097156でARG_MAXを超えています。 というわけで、引数の長さには2つ制限があり、
- 引数単位での文字列長の上限
- コマンド全体での長さの上限
0 件のコメント :
コメントを投稿