2023/03/06

subprocess.runの文字列長の制限

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つ制限があり、

  • 引数単位での文字列長の上限
  • コマンド全体での長さの上限
の2つがあることがわかりました。

0 件のコメント :