Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中隐藏控制台窗口?_Python_Console_Hide - Fatal编程技术网

如何在python中隐藏控制台窗口?

如何在python中隐藏控制台窗口?,python,console,hide,Python,Console,Hide,我正在用Python编写一个IRC机器人 我希望为它的Linux和Windows制作独立的二进制文件。我主要希望当bot启动时,控制台窗口应该隐藏,用户应该看不到窗口 我能做些什么呢?在linux中,只要运行它,没问题。在Windows中,您希望使用pythonw可执行文件 更新 好的,如果我理解了评论中的问题,您是在问如何使从命令行启动bot的命令窗口在之后消失 UNIX(Linux) $nohup mythonprog& 窗户 C:/>启动pythonw mypythonprog 我

我正在用Python编写一个IRC机器人

我希望为它的Linux和Windows制作独立的二进制文件。我主要希望当bot启动时,控制台窗口应该隐藏,用户应该看不到窗口


我能做些什么呢?

在linux中,只要运行它,没问题。在Windows中,您希望使用pythonw可执行文件

更新 好的,如果我理解了评论中的问题,您是在问如何使从命令行启动bot的命令窗口在之后消失

  • UNIX(Linux)
$nohup mythonprog&

  • 窗户
C:/>启动pythonw mypythonprog


我想那是对的。在任何情况下,现在都可以关闭终端。

只需使用
.pyw
扩展名保存即可。这将阻止控制台窗口打开

在Windows系统上,没有“可执行模式”的概念。Python安装程序会自动将.py文件与Python.exe关联,以便双击Python文件将其作为脚本运行扩展名也可以是.pyw,在这种情况下,通常显示的控制台窗口被抑制。

在Unix系统上(包括GNU/Linux、macOS和BSD) 使用
nohup mypythonprog&
,您可以在不中断进程的情况下关闭终端窗口。如果您在云中运行并且不想留下挂起的shell进程,那么您也可以运行
exit

在Windows系统上 使用扩展名
.pyw
保存程序,现在它将以
pythonw.exe
打开。没有贝壳窗


例如,如果您有
foo.py
,您需要将其重命名为
foo.pyw

,如果您只想在安装了Python解释器的windows计算机上运行Python脚本,那么将保存的脚本的扩展名从.py'转换为.pyw'应该就可以了

但是,如果使用py2exe将脚本转换为在任何windows计算机上运行的独立应用程序,则需要对“setup.py”文件进行以下更改

以下示例是使用Tkinter制作的简单python GUI:

from distutils.core import setup
import py2exe
setup (console = ['tkinter_example.pyw'],
       options = { 'py2exe' : {'packages':['Tkinter']}})
将上面代码中的“控制台”更改为“windows”


这将只打开Tkinter生成的GUI,而不打开控制台窗口。

这将隐藏您的控制台。首先在代码中实现这些行,开始隐藏控制台

import win32gui, win32con

the_program_to_hide = win32gui.GetForegroundWindow()
win32gui.ShowWindow(the_program_to_hide , win32con.SW_HIDE)
2020年5月更新:

如果在命令提示符下执行
pip安装win32con
时遇到问题,只需
pip安装pywin32
。然后在python脚本上执行
import win32.lib.win32con as win32con
,而不是执行
import win32con

要再次显示您的程序,请执行以下操作:

win32gui.ShowWindow(the_program_to_hide , win32con.SW_SHOW)

一些额外的信息。对于需要Mohsen Haddadi在本线程前面发布的win32gui解决方案的情况:

从Python361开始,win32gui和win32con不是PythonSTD库的一部分。 要使用它们,需要安装pywin32软件包;现在可以通过pip

有关pywin32软件包的更多背景信息,请访问:

此外,为了在关闭窗口时谨慎行事,以避免无意中关闭前景中的任何窗口,可以沿以下几行扩展分辨率:

try     :

    import win32gui, win32con;

    frgrnd_wndw = win32gui.GetForegroundWindow();
    wndw_title  = win32gui.GetWindowText(frgrnd_wndw);
    if wndw_title.endswith("python.exe"):
        win32gui.ShowWindow(frgrnd_wndw, win32con.SW_HIDE);
    #endif
except  :
    pass

用于此的装饰器工厂(windows版本、unix版本应该更容易通过
os.fork

def deco_factory_daemon_subprocess(*,flag_env_var_name=''此_daemon_subprocess_uuuuuuuu',**kwargs_表示子流程):
def deco(目标):
@functools.wrapps(目标)
def tgt(*args,**kwargs):
如果os.environ.get(flag_env_var_name)==\u文件:
目标(*args,**kwargs)
其他:
os.environ[flag\u env\u var\u name]=\u文件__
real_argv=psutil.Process(os.getpid()).cmdline()
exec\u dir,exec\u basename=path\u split(real\u argv[0])
如果exec_basename.lower()='python.exe':
real_argv[0]=shutil.which('pythonw.exe'))
kwargs=dict(env=os.environ,stdout=subprocess.PIPE,stderr=subprocess.PIPE,)
更新(子流程的kwargs_)
子流程Popen(real_argv,**kwargs)
返回tgt
返回装饰
像这样使用它:

@deco\u工厂\u守护进程\u子进程()
def run():
...
def main():
运行()

这不是主要问题。。。主要问题是在程序运行时隐藏控制台窗口。它是如何做到这一点的?你指的是你要启动它的那个吗?将文件扩展名更改为.pyw以与pythonw.exe关联“nohup mypythonprog&”将在linux中帮助我。。。但是python不会安装在windows机器上。所以“开始pythonw我的pythonprog”对我没什么帮助,我明白了。实际上unix==unix,不要骚扰你的长辈。你为什么不把解释贴在这里?这里有第2.2.2节。虽然我觉得这个问题的答案有点离题,但我还是继续发布了它,因为它回答了下面的问题(下面的链接),它被标记为这个问题的副本。我实际上使用的是pyinstaller,但它也有一个选项(-w)并为我解决了问题。请用英语解释你的代码。谢谢不需要解释的人可以自己编写。但运行此操作时,终端会短暂弹出。如果我想停止该终端行,该怎么办?要再次显示隐藏的程序,请使用以下行:win32gui.ShowWindow(win32gui.ShowWindow(win32con.SW\u hide,win32con.SW\u show)这将我从一个恼人的问题中解救出来,谢谢:)为什么不直接使用扩展名*.pyw?这太长了。在使用诸如本地主机上的Cgi服务器(http.server)之类的用例时,使用.pyw扩展可能不是一个解决方案。因为在这样的情况下,
try     :

    import win32gui, win32con;

    frgrnd_wndw = win32gui.GetForegroundWindow();
    wndw_title  = win32gui.GetWindowText(frgrnd_wndw);
    if wndw_title.endswith("python.exe"):
        win32gui.ShowWindow(frgrnd_wndw, win32con.SW_HIDE);
    #endif
except  :
    pass