我正在运行:
os.system("/etc/init.d/apache2 restart")
它会重新启动网络服务器,就像我应该直接从终端运行命令一样,它会输出:
* Restarting web server apache2 ...
waiting [ OK ]
但是,我不希望它在我的应用中实际输出它。我该如何禁用它? 谢谢!
答案 0 :(得分:32)
一定避免os.system()
,而是使用子流程:
with open(os.devnull, 'wb') as devnull:
subprocess.check_call(['/etc/init.d/apache2', 'restart'], stdout=devnull, stderr=subprocess.STDOUT)
这是subprocess
的等效/etc/init.d/apache2 restart &> /dev/null
。
有subprocess.DEVNULL
on Python 3.3+:
#!/usr/bin/env python3
from subprocess import DEVNULL, STDOUT, check_call
check_call(['/etc/init.d/apache2', 'restart'], stdout=DEVNULL, stderr=STDOUT)
答案 1 :(得分:21)
您应该使用subprocess
模块,以灵活的方式控制stdout
和stderr
。不推荐使用os.system
。
subprocess
模块允许您创建表示正在运行的外部进程的对象。你可以从它的stdout / stderr读取它,写入它的stdin,发送信号,终止它等。模块中的主要对象是Popen
。还有许多其他便利方法,如通话等。docs非常全面,包括section on replacing the older functions (including os.system
)。
答案 2 :(得分:21)
根据您的操作系统(这就是Noufal说的原因,您应该使用子流程),您可以尝试类似
的操作 os.system("/etc/init.d/apache restart > /dev/null")
或(也使错误静音)
os.system("/etc/init.d/apache restart > /dev/null 2>&1")
答案 3 :(得分:0)
这是几年前拼凑在一起的系统调用函数,用于各种项目。如果你根本不想要命令的任何输出,你可以说out = syscmd(command)
然后对out
不做任何事情。
经过测试,可在Python 2.7.12和3.5.2中使用。
def syscmd(cmd, encoding=''):
"""
Runs a command on the system, waits for the command to finish, and then
returns the text output of the command. If the command produces no text
output, the command's return code will be returned instead.
"""
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT,
close_fds=True)
p.wait()
output = p.stdout.read()
if len(output) > 1:
if encoding: return output.decode(encoding)
else: return output
return p.returncode