Mam Python 3.4.3 na Linux 3.16.0. Chcę użyć polecenia subprocess.Popen
, aby uruchomić polecenie z długim pojedynczym argumentem (złożonym wywołaniem Bash), około 200 KB.Dlaczego limit długości argumentu podprocesu.Popen jest mniejszy niż to, co raportuje system operacyjny?
Według getconf
i xargs
, to powinno być dobrze w moich granicach:
$ getconf ARG_MAX
2097152
$ xargs --show-limits < /dev/null
Your environment variables take up 3364 bytes
POSIX upper limit on argument length (this system): 2091740
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2088376
Size of command buffer we are actually using: 131072
Jednak Python nie powiedzie się z dość mniejszych limitów:
>>> subprocess.Popen('echo %s > /dev/null' % ('a' * (131072-4096)), shell=True, executable='/bin/bash')
<subprocess.Popen object at 0x7f4613b58410>
>>> subprocess.Popen('echo %s > /dev/null' % ('a' * (262144-4096)), shell=True, executable='/bin/bash')
Traceback (most recent call last):
[...]
OSError: [Errno 7] Argument list too long
nocie, że limit Python jest mniej więcej taka sama jako raporty o "faktycznie używanym" buforze poleceń xargs
. Sugeruje to, że xargs
jest wystarczająco inteligentny, aby zacząć od mniejszego limitu i zwiększyć go w razie potrzeby, ale Python nie jest.
Pytania:
- Dlaczego Python ograniczają mniejsza niż limit OS z 2MiB?
- Czy mogę zwiększyć limit Pythona?
- Jeśli tak, w jaki sposób?
Nie używaj API "pojedynczego ciągu" z 'subprocess.Popen()'. Zawsze należy podać listę. Unikaj 'shell = True'. –
W tym przypadku faktycznie polegam na funkcjach Bash w podprocesie. – Reid
Spróbuj 'podprocesu.Popen ('echo $ SHELL') '. Myślę, że da ci '/ bin/sh', a nie bash. –