Python subprocess.call() не работает при использовании pythonw.exe

У меня есть некоторый код Python, который работает правильно, когда я использую python.exe для его запуска, но терпит неудачу, если я использую pythonw.exe.

    def runStuff(commandLine):
        outputFileName = 'somefile.txt'
        outputFile = open(outputFileName, "w")

        try:
            result = subprocess.call(commandLine, shell=True, stdout=outputFile)
        except:
            print 'Exception thrown:', str(sys.exc_info()[1])

    myThread = threading.Thread(None, target=runStuff, commandLine=['whatever...'])
    myThread.start()

Сообщение, которое я получаю:

    Exception thrown: [Error 6] The handle is invalid

Однако, если я не укажу параметр 'stdout', subprocess.call() запустится нормально.

Я вижу, что pythonw.exe может сам перенаправлять вывод, но я не понимаю, почему я не могу указать стандартный вывод для нового потока.


person Charles Anderson    schedule 03.12.2008    source источник


Ответы (3)


Дескрипторы sys.stdin и sys.stdout недействительны, потому что pythonw не обеспечивает поддержку консоли, поскольку он работает как демон, поэтому аргументы subprocess.call() по умолчанию не работают.

Программы Deamon намеренно закрывают stdin/stdout/stderr и вместо этого используют журналирование, так что вам придется управлять этим самостоятельно: я бы предложил использовать subprocess.PIPE.

Если вас на самом деле не волнует, что подпроцесс говорит об ошибках и все такое, вы можете использовать os.devnull (я не совсем уверен, насколько он переносим?), но я бы не рекомендовал этого.

person Piotr Lesnicki    schedule 03.12.2008

Для справки, мой код теперь выглядит так:

def runStuff(commandLine):
    outputFileName = 'somefile.txt'
    outputFile = open(outputFileName, "w")

    if guiMode:
        result = subprocess.call(commandLine, shell=True, stdout=outputFile, stderr=subprocess.STDOUT)
    else:
        proc = subprocess.Popen(commandLine, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
        proc.stdin.close()
        proc.wait()
        result = proc.returncode
        outputFile.write(proc.stdout.read())

Обратите внимание, что из-за очевидной ошибки в модуле подпроцесса вызов Popen() также должен указывать канал для стандартного ввода, который мы сразу же после этого закрываем.

person Charles Anderson    schedule 22.12.2008

Это старый вопрос, но та же проблема возникла и с pyInstaller.

По правде говоря, это произойдет с любым фреймворком, который конвертирует код в python для exe без консоли.

В своих тестах я заметил, что если я использую флаг «console = True» в моем файле спецификаций (pyInstaller), ошибка больше не возникает. .

Решение последовало совету Петра Лесницкого.

person Eduardo    schedule 22.08.2014
comment
В настоящее время у меня такая же проблема, я сделал большое приложение с PyQt4, и я не могу заставить селен работать без консоли. Пожалуйста, скажите мне, как это исправить. stackoverflow.com/questions/46520823/ - person Ahmad Taha; 02.10.2017