没有输出的Python os.system

时间:2011-04-08 14:55:27

标签: python subprocess os.system

我正在运行:

os.system("/etc/init.d/apache2 restart")

它会重新启动网络服务器,就像我应该直接从终端运行命令一样,它会输出:

* Restarting web server apache2 ... waiting [ OK ]

但是,我不希望它在我的应用中实际输出它。我该如何禁用它? 谢谢!

4 个答案:

答案 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模块,以灵活的方式控制stdoutstderr。不推荐使用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