У меня есть некоторые странные поведенческие различия между Python subprocess.call () и os.system (), которые, похоже, связаны с setgid. Разница заключается в том, что при использовании subprocess.call () вызываются проверки на заражение в Perl, что создает проблемы, поскольку у меня нет возможности изменять все сценарии Perl, для которых требуется добавление к ним необработанного кода.
Пример, "process.py"
#!/usr/bin/python
import os, subprocess
print "Python calling os.system"
os.system('perl subprocess.pl true')
print "Python done calling os.system"
print "Python calling subprocess.call"
subprocess.call(['perl', 'subprocess.pl', 'true'])
print "Python done calling subprocess.call"
"subprocess.pl"
#!/usr/bin/perl
print "perl subprocess\n";
`$ARGV[0]`;
print "perl subprocess done\n";
Вывод - оба запуска subprocess.pl должны быть одинаковыми, но один запуск с subprocess.call () выдает ошибку taint:
mybox> process.py
Python calling os.system
perl subprocess
perl subprocess done
Python done calling os.system
Python calling subprocess.call
perl subprocess
Insecure dependency in `` while running setgid at subprocess.pl line 4.
Python done calling subprocess.call
mybox>
Хотя использование os.system () работает, я действительно предпочел бы использовать subprocess.check_call (), поскольку он более совместим с форвардом и имеет хорошие способы проверки.
Любые предложения или документы, которые могут объяснить, почему эти два отличаются? Возможно ли, что это какая-то странная настройка в моей локальной среде unix, которая вызывает такое поведение?