On 10/2/20, Gertjan Klein <gkl...@xs4all.nl> wrote: > Eryk Sun wrote: > >> If .py files are associated with py.exe or python.exe, then running a >> .py script either inherits or allocates a console and attaches to it. > > Is it possible to determine, from within Python, whether Python > allocated or inherited the console?
If a console session isn't headless (i.e. it's not a pseudoconsole) and has a window (i.e. not allocated with CREATE_NO_WINDOW), then the effective owner of the window is initially the process that allocated the console session, as long as it's still running and attached. For example, with "python.exe" (not a launcher) executed from Explorer: >>> hwnd = win32console.GetConsoleWindow() >>> tid, pid = win32process.GetWindowThreadProcessId(hwnd) >>> pid == os.getpid() True A problem is the case of a launcher such as "py.exe", or the "python.exe" launcher used by venv virtual environments. A venv launcher can be detected by comparing sys.executable with sys._base_executable. For example, with a venv launcher executed from Explorer: >>> hwnd = win32console.GetConsoleWindow() >>> tid, pid = win32process.GetWindowThreadProcessId(hwnd) The current process doesn't own the console, but the parent does: >>> pid == os.getpid() False >>> pid == os.getppid() True Check whether the parent is a venv launcher: >>> print(sys.executable) C:\Temp\env\test38\Scripts\python.exe >>> print(sys._base_executable) C:\Program Files\Python38\python.exe Double check that the parent is the venv launcher: >>> access = win32con.PROCESS_QUERY_LIMITED_INFORMATION >>> hproc = win32api.OpenProcess(access, False, pid) >>> executable = win32process.GetModuleFileNameEx(hproc, None) >>> os.path.samefile(executable, sys.executable) True -- https://mail.python.org/mailman/listinfo/python-list