Отключение вывода при компиляции с помощью distutils

У меня есть сценарий setup.py, который должен проверять компилятор на наличие определенных вещей, таких как поддержка TR1, наличие из windows.h (чтобы добавить определение NOMINMAX) и т.д. Я провожу эти проверки, создавая простую программу и пытаясь скомпилировать ее с помощью класса компилятора Distutils. Мой ответ - наличие / отсутствие ошибок.

Это работает хорошо, но это означает, что некрасивые сообщения об ошибках компилятора выводятся на консоль. Есть ли способ подавить сообщения об ошибках, когда функция compile вызывается вручную?

Вот моя функция, которая пытается скомпилировать программу, которая теперь ДЕЙСТВИТЕЛЬНО устраняет сообщения об ошибках, направляя поток ошибок в файл (ответил на мой собственный вопрос):

def see_if_compiles(program, include_dirs, define_macros):
    """ Try to compile the passed in program and report if it compiles successfully or not. """
    from distutils.ccompiler import new_compiler, CompileError
    from shutil import rmtree
    import tempfile
    import os

    try:
        tmpdir = tempfile.mkdtemp()
    except AttributeError:
        # Python 2.2 doesn't have mkdtemp().
        tmpdir = "compile_check_tempdir"
        try:
            os.mkdir(tmpdir)
        except OSError:
            print "Can't create temporary directory. Aborting."
            sys.exit()

    old = os.getcwd()

    os.chdir(tmpdir)

    # Write the program
    f = open('compiletest.cpp', 'w')
    f.write(program)
    f.close()

    # redirect the error stream to keep ugly compiler error messages off the command line
    devnull = open('errors.txt', 'w')
    oldstderr = os.dup(sys.stderr.fileno())
    os.dup2(devnull.fileno(), sys.stderr.fileno())
    #
    try:
        c = new_compiler()
        for macro in define_macros:
            c.define_macro(name=macro[0], value=macro[1])
        c.compile([f.name], include_dirs=include_dirs)
        success = True
    except CompileError:
        success = False
    # undo the error stream redirect
    os.dup2(oldstderr, sys.stderr.fileno())
    devnull.close()

    os.chdir(old)
    rmtree(tmpdir)
    return success

Вот функция, которая использует вышеуказанное для проверки наличия заголовка.

def check_for_header(header, include_dirs, define_macros):
    """Check for the existence of a header file by creating a small program which includes it and see if it compiles."""
    program = "#include <%s>\n" % header
    sys.stdout.write("Checking for <%s>... " % header)
    success = see_if_compiles(program, include_dirs, define_macros)
    if (success):
        sys.stdout.write("OK\n");
    else:
        sys.stdout.write("Not found\n");
    return success
10
задан Adam 18 August 2011 в 20:08
поделиться