Python subprocess.call () завершается ошибкой при использовании pythonw.exe - PullRequest
5 голосов
/ 03 декабря 2008

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

Ответы [ 3 ]

7 голосов
/ 03 декабря 2008
Дескрипторы

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

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

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

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

2 голосов
/ 22 августа 2014

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...