检测是否通过Windows GUI(双击)与命令提示符

时间:2019-03-14 21:12:23

标签: python python-3.x windows pyinstaller

背景
我有一个通过pyinstaller编译成Windows可执行文件的Python 3.5控制台程序。

问题

  • 通过命令提示符执行时,我希望程序以提供的任何参数运行(可能没有)。
  • 通过操作系统的GUI执行时(例如,在Windows的Windows资源管理器中双击.exe等),我希望程序提示用户输入。我还需要在退出之前暂停程序,以便用户可以读取输出。

如何检测这些不同的情况?

约束

  1. 该可执行文件必须能够在准系统(即全新安装)的Windows / RedHat计算机上运行。
  2. 已编译可执行文件必须是单个文件,并且不得依赖未打包在已编译可执行文件中的其他文件(pyinstaller允许将文件打包在已编译可执行文件中)。
  3. 该程序可能取决于第三方python软件包。

我尝试过的事情

2 个答案:

答案 0 :(得分:1)

计算连接到控制台的进程

Windows API documentation for 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...')

答案 1 :(得分:0)

结果证明,有一种简单明了的方法可以在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...')