在Python脚本中隐藏os.system命令行调用
我有一个Python脚本(myscript.py),我在Linux服务器上运行它,命令是这样的:
python myscript.py
在我的脚本中,我使用了系统调用,下面是一个例子:
os.system("./myprogram.pl -x 5 > results.out")
当我在服务器上运行myscript.py时,每当有os.system
调用时,命令的执行过程都会在服务器上显示出来。有没有办法让所有的命令调用不被显示出来,也就是说在程序(myscript.py
)内部调用时,这些命令不被显示?(这里不是说要隐藏命令调用后产生的输出)
3 个回答
0
你的意思是,能不能让命令在 ps、top 这些工具里不显示出来?答案是不能。
在某些系统上,myprogram.pl 可以自己隐藏命令行不让它在 ps 中出现;比如在 perl 里:
$0 = 'new program name';
这个方法是修改 ps 里的记录,而不是直接删除它。因为这个记录是由新进程设置的,所以有个时间差,可能有人在它被修改之前就看到了。而且,超级用户可以通过其他方式获取到同样的信息。总之,没有安全的方法可以完全让其他用户看不到你的命令行,也没有人打算提供这样的功能。
0
使用subprocess模块来创建一个子进程,这样你就不会看到这个进程的任何输出,除非你直接从管道(PIPE)中读取。
process = subprocess.Popen(['perl', 'myprogram.pl'], stdout = subprocess.PIPE )
0
你可以用子进程管道来代替os.system命令:
import subprocess;
NewPipeObject = subprocess.Popen( [ './myprogram.pl -x 5 > results.out' ],
stdout= subprocess.PIPE,
stderr= subprocess.PIPE );
或者你可以利用子进程管道的参数列表格式(它会在每个列表元素之间加一个空格),把它们呈现成下面这样(这样更容易通用):
import subprocess;
NewPipeObject = subprocess.Popen( [ './myprogram.pl',
'-x',
'5',
'>',
'results.out' ],
stdout= subprocess.PIPE,
stderr= subprocess.PIPE );
无论哪种方式,你都是把stdout
和stderr
的输出压制到管道对象中(NewPipeObject
)。