从运行 .pyw 脚本调出 python 控制台窗口
Posted
技术标签:
【中文标题】从运行 .pyw 脚本调出 python 控制台窗口【英文标题】:Bring up python console window from running .pyw script 【发布时间】:2019-01-09 18:15:09 【问题描述】:我有一个脚本,通常我不希望控制台窗口像 .py 文件那样显示,而使用 .pyw 扩展名可以做到这一点。
我的问题,有没有办法从 .pyw 文件中调出正在运行的脚本的控制台窗口?
【问题讨论】:
解释器是评估源代码的语言运行时,并为 CPython 提供扩展的 C API。我认为您想要某种外壳,可能是默认的 REPL,有时称为“交互式解释器”(例如,参见标准库的“代码”模块),尽管它的名称不准确。这在 pythonw.exe GUI 进程中是可能的。通过kernel32 = ctypes.WinDLL('kernel32', use_last_error=True);
kernel32.AllocConsole()
分配一个控制台。通过打开“CONIN$”和“CONOUT$”设置sys.[stdin|stdout|stderr]
。然后调用代码模块的interact
函数。
是的,我真的不知道该怎么称呼它,称它为 shell 只会得到大量的“如何打开命令提示符”响应。我更感兴趣的是让它调出它在运行期间会打印到的外壳。
看起来 ***.com/questions/6673022/… 和 ***.com/questions/7883214/… 是相关的。最好只作为 .py 运行并隐藏听起来像的控制台。
我认为通过AllocConsole
获取新控制台非常简单。绝对不要使用AttachConsole
来抢别人的控制台。对于标准 I/O,它最多用于编写一些行,但即使这样也会让用户感到困惑。附加运行外壳将是一团糟。 AttachConsole
的正确用途是获取控制台窗口句柄,或抓取控制台屏幕缓冲区,或控制台 API 的其他用途,例如生成控制事件。
【参考方案1】:
最终采用了使用.py
文件并抑制控制台窗口的方法。
将简单的切换功能绑定到按钮:
import ctypes
def raise_console(console_toggle):
"""Brings up the Console Window."""
if console_toggle:
# Show console
ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 4)
else:
# Hide console
ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 0)
console_toggle = not console_toggle
console_toggle = False
【讨论】:
以上是关于从运行 .pyw 脚本调出 python 控制台窗口的主要内容,如果未能解决你的问题,请参考以下文章
python .py .pyc .pyw .pyo .pyd区别