У меня есть код 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 для нового потока.






Дескрипторы 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/…