从运行 .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文件名通常以啥结尾

python中.py和.pyw文件的区别

python .py .pyc .pyw .pyo .pyd区别

在两个 python 脚本之间安全地发送信息

python的文件格式有两种,"*.py"和"*.pyw",它们有啥不同?

青少年编程 电子学会python编程等级考试一级真题解析(判断题)2020-12