Определить, выполняется ли программа на Python через Windows GUI (двойной щелчок) или командную строку - PullRequest
4 голосов
/ 15 марта 2019

Фон
У меня есть консольная программа Python 3.5, скомпилированная в исполняемый файл Windows через pyinstaller.

Вопрос

  • При выполнении через командную строку мне бы хотелось, чтобы моя программа работала с любыми предоставленными аргументами (возможно, без).
  • При выполнении через графический интерфейс операционной системы (т. Е. Двойным щелчком на .exe в Windows Explorer в Windows и т. Д.) Я бы хотел, чтобы моя программа запрашивала ввод данных у пользователя. Мне также нужно, чтобы моя программа приостановила работу перед выходом, чтобы пользователь мог прочитать вывод.

Как я могу обнаружить эти разные сценарии?

Ограничения

  1. Исполняемый файл должен быть в состоянии работать на чистом компьютере (т.е. при новой установке) на компьютере Windows / RedHat.
  2. Скомпилированный исполняемый файл должен быть одним файлом и не должен полагаться на другие файлы, не упакованные в скомпилированный исполняемый файл (pyinstaller позволяет упаковывать файлы внутри скомпилированного исполняемого файла).
  3. Программа может зависеть от сторонних пакетов Python.

Вещи, которые я пробовал

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Количество процессов, подключенных к консоли

Документация по Windows API для GetConsoleProcessList

import ctypes

# Load kernel32.dll
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
# Create an array to store the processes in.  This doesn't actually need to
# be large enough to store the whole process list since GetConsoleProcessList()
# just returns the number of processes if the array is too small.
process_array = (ctypes.c_uint * 1)()
num_processes = kernel32.GetConsoleProcessList(process_array, 1)
# num_processes may be 1 if your compiled program doesn't have a launcher/wrapper.
if num_processes == 2:
    input('Press ENTER to continue...')
0 голосов
/ 19 марта 2019

Оказывается, существует простой и лаконичный способ определить это в Windows.https://stackoverflow.com/a/14394730/3508142

Переменная среды PROMPT определяет текст приглашения в командной строке.https://ss64.com/nt/prompt.html

# If the program was started via the GUI (i.e. by double-clicking the executable),
# then prevent the console window from closing automatically.
if os.name == 'nt' and 'PROMPT' not in os.environ:
    input('Press ENTER to continue...')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...