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 может перенаправлять сам вывод, но я не понимаю, почему мне запрещено указывать stdout для нового потока.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
0
5 825
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

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

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

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 () также необходимо указать канал для stdin, который мы сразу же закрываем.

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

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

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

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

В настоящее время у меня такая же проблема, я сделал большое приложение с PyQt4, и я не могу заставить селен работать без консоли. Подскажите пожалуйста, как это исправить. stackoverflow.com/questions/46520823/…

Ahmad Taha 02.10.2017 13:54

Другие вопросы по теме