Python 3.3+: как подавить исключения в subprocess.Popen ()? - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть класс с некоторыми функциями, которые в основном выполняют проверку выходных данных, функции этого класса вызываются с помощью подпроцесса.Теперь, если проверка выходных данных завершается неудачно, у подпроцесса есть вызов sys.exit с другим кодом, в зависимости от того, какая проверка завершилась неудачей.

В основном коде у меня есть это:

try:
    exitCode = 0
    #import module for current test
    teststr = os.path.splitext(test)[0]
    os.chdir(fs.scriptFolder)
    test = __import__(teststr)
    #delete old output folder and create a new one
    if  os.path.isdir(fs.outputFolder):
        rmtree(fs.outputFolder)
    os.mkdir(fs.outputFolder)
    # run the test passed into the function as a new subprocess
    os.chdir(fs.pythonFolder)
    myEnv=os.environ.copy()
    myEnv["x"] = "ON"
    testSubprocess = Popen(['python', test.testInfo.network + '.py', teststr], env=myEnv)
    testSubprocess.wait()
    result = addFields(test)
    # poke the data into the postgresql database if the network ran successfully 
    if testSubprocess.returncode == 0:
        uploadToPerfDatabase(result)     
    elif testSubprocess.returncode == 1:
        raise Exception("Incorrect total number of rows on output, expected: " + str(test.testInfo.outputValidationProps['TotalRowCount']))
        exitCode = 1
    elif testSubprocess.returncode == 2:
        raise Exception("Incorrect number of columns on output, expected: " + str(test.testInfo.outputValidationProps['ColumnCount']))
        exitCode = 1
except Exception as e:
    log.out(teststr + " failed", True)
    log.out(str(e))
    log.out(traceback.format_exc())
    exitCode = 1 
return exitCode

Теперьвыходные данные этого показывают все исключения traceback и python для вызовов sys.exit в подпроцессе.Я фактически регистрирую все ошибки, поэтому я не хочу, чтобы что-либо отображалось в командной строке, если я не распечатал это вручную.Я не совсем уверен, как это сделать.

1 Ответ

0 голосов
/ 19 ноября 2018

Вы можете указать stderr для записи в os.devnull с флагом subprocess.DEVNULL:

p = Popen(['python', '-c', 'print(1/0)'], stderr=subprocess.DEVNULL)

subprocess.DEVNULL Специальное значение, которое можно использовать в качестве аргумента stdin, stdout или stderr для Popen и указывает, что будет использоваться специальный файл os.devnull.

Новое в версии 3.3. * Docs 1013 *

...