シェルスクリプトで書かれたプログラムをPythonで置き換える際に一部シェルコマンドをPythonから呼び出す必要があったのですが、シェル呼び出しにはOS毎に異なる文字数制限があるようなので調査を行いました。
調査対象のコマンド
- os.system()
- subprocess.run(shell=True)
調査対象のOS
- OSX Sierra
- Windows 7
- Ubuntu 16
- CentOS 7
調査に使用したスクリプト
os.system()
import os
i = 100000000
n = 0
while True:
n += i
arg = 'b' * n
command = 'echo "{arg}"'.format(arg=arg)
result = os.system(command)
if result != 0:
if i == 1:
break
n -= i
i //= 10
print("LENGTH: ", n -1 + 7) # echo、カンマ、スペースの分を足す
subprocess.run(shell=True)
import subprocess
i = 100000000
n = 0
while True:
try:
n += i
arg = 'b' * n
command = 'echo "{arg}"'.format(arg=arg)
subprocess.run(command,shell=True)
except OSError:
if i == 1:
break
n -= i
i //= 10
print("LENGTH: ", n -1 + 7) # echo、カンマ、スペースの分を足す
調査結果
OSX sierra (Python3.6.1)
Python3はhttps://www.python.org/ からダウンロードした物
コマンド | os.system | subprocess.run |
---|---|---|
最大文字数 | 260554字 | 260549字 |
Windows7 (Python3.6.1)
Python3はhttps://www.python.org/ からダウンロードした物
コマンド | os.system | subprocess.run |
---|---|---|
最大文字数 | 8160字 | 32733字 |
Ubuntu16.04 (Python3.5.2)
Python3は標準のリポジトリに入っているもの
コマンド | os.system | subprocess.run |
---|---|---|
最大文字数 | 131071字 | 131071字 |
CentOS7 (Python3.6.1)
Python3はIUS communityのリポジトリからインストールした物
コマンド | os.system | subprocess.run |
---|---|---|
最大文字数 | 131071字 | 131071字 |
subprocess.run(shell=False)の場合
shell=Falseのパターンも検証を行ったのですが、上手く調査できているか心配だったので上記に記載しませんでした。
第一引数に文字を詰めまくる調査を行った所
* Linux系はshell=Falseの場合とほぼ変わらない
* OSXで521342字程度
* Windowsではメモリーエラー
という結果になりました。