我在 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"
“子进程.pl”
#!/usr/bin/perl
print "perl subprocess\n";
`$ARGV[0]`;
print "perl subprocess done\n";
输出 - subprocess.pl 的两次运行应该是相同的,但是使用 subprocess.call() 运行的一次会出现污染错误:
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 环境中调用这些行为的一些奇怪设置吗?