subprocess.run не работает при использовании pyinstaller с --noconsole --onefile - PullRequest
0 голосов
/ 14 июля 2020

Я использую Pyinstaller 3.6, Python 3.8.3, и когда я компилирую этот код (используя флаг --onefile):

import subprocess

try:
    output = subprocess.run('dir', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

    toWrite = output.stdout.decode('ansi')

    f = open('output.txt', 'w')
    f.write(toWrite)
    f.close()
except Exception as e:
    f = open('output.txt', 'w')
    f.write(str(e))
    f.close()

exit(0)

, все работает нормально. Вот файл output.txt:

 Volume in drive C has no label.

 Volume Serial Number is E612-C89D

 Directory of C:\Users\trolo\OneDrive\Desktop\progs\tests\dist

14.07.2020  12:11    <DIR>          .
14.07.2020  12:11    <DIR>          ..
14.07.2020  11:58         9я777я078 test3.exe

               1 File(s)      9я777я078 bytes
               2 Dir(s)  12я544я409я600 bytes free

Но когда я добавляю флаг --noconsole, я получаю следующее в файле output.txt:

[WinError 6] The handle is invalid

Что такое неправильно, как заставить его работать, не показывая окно консоли?

1 Ответ

1 голос
/ 14 июля 2020

python 3: вы можете просто передать stdin = subprocess.DEVNULL

subprocess.Popen( args=[self.exec_path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.DEVNULL)

Python 2.x: вам нужно получить обработчик файла в null, а затем передать это в popen

devnull = open(os.devnull, 'wb')
subprocess.Popen( args=[self.exec_path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=devnull)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...