我可以为此做什么?

1 个评论
python
console
hide
Godwin Austin
Godwin Austin
发布于 2009-04-19
9 个回答
mdec
mdec
发布于 2021-05-29
已采纳
0 人赞同

只需用 .pyw 的扩展名来保存它。这将阻止控制台窗口的打开。

在 Windows 系统上,不存在 "可执行模式 "的概念。Python 安装程序会自动将 .py 文件与 python.exe 联系起来,因此双击一个 Python 文件会将其作为一个脚本运行。 扩展名也可以是.pyw,在这种情况下,通常出现的控制台窗口被抑制。

2.2.2节底部的解释

该链接中没有2.2.2节。你为什么不在这里发表解释?
非常感谢!我在用pyinstaller生成可执行文件时,它对我有用。当我使用pyinstaller生成可执行文件时,它对我有效。
Charlie Martin
Charlie Martin
发布于 2021-05-29
0 人赞同

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

Update

好的,如果我理解评论中的问题,你是在问如何让你从命令行启动机器人的命令窗口在之后消失?

  • UNIX (Linux)
  • $ nohup mypythonprog &

  • Windows
  • C:/> start pythonw mypythonprog

    I think 这就对了。 无论如何,现在你可以关闭终端。

    这不是主要的问题...主要的问题是在程序运行时隐藏控制台窗口。它如何做到这一点?
    你是说你要开始的那个?
    将文件扩展名改为.pyw,以便与pythonw.exe相关联。 oreilly.com/catalog/pythonwin32/chapter/ch20.html
    "nohup mypythonprog &" will help me in linux ... but python is not gonna be installed on the windows machine. So "start pythonw mypythonprog" wont help me i guess.
    哦,我明白了。其实unix == UNIX,不要骚扰你的长辈。
    noɥʇʎԀʎzɐɹƆ
    noɥʇʎԀʎzɐɹƆ
    发布于 2021-05-29
    0 人赞同

    On Unix Systems (including GNU/Linux, macOS, and BSD)

    使用 nohup mypythonprog & ,你可以关闭终端窗口而不中断进程。如果你在云端运行,不想留下一个挂起的shell进程,你也可以运行 exit

    On Windows Systems

    .pyw 扩展名保存程序,现在它将以 pythonw.exe 打开。没有壳窗口。

    例如,如果你有 foo.py ,你需要把它重命名为 foo.pyw

    Mohsen Haddadi
    Mohsen Haddadi
    发布于 2021-05-29
    0 人赞同

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

    import win32gui, win32con
    the_program_to_hide = win32gui.GetForegroundWindow()
    win32gui.ShowWindow(the_program_to_hide , win32con.SW_HIDE)
    

    2020年5月更新 :

    如果你在命令提示符上的pip install win32con有问题,你可以简单地pip install pywin32.然后在你的python脚本上,执行import win32.lib.win32con as win32con而不是import win32con

    要再次显示你的程序 win32con.SW_SHOW工作正常。

    win32gui.ShowWindow(the_program_to_hide , win32con.SW_SHOW)
        
    请用英语解释你的代码。谢谢!不需要解释的人可以自己写。
    不过在运行这个的时候,终端会短暂地弹出。
    如果我想停止那条终端线怎么办?
    要再次显示被隐藏的程序,请使用这一行:win32gui.ShowWindow(The_program_to_hide , win32con.SW_SHOW)
    这把我从一个恼人的问题中解救出来,谢谢你 :)
    John918
    John918
    发布于 2021-05-29
    0 人赞同

    如果你只想在安装了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']}})
    

    将上述代码中的 "控制台 "改为 "窗口"。

    from distutils.core import setup
    import py2exe
    setup (windows = ['tkinter_example.pyw'],
           options = { 'py2exe' : {'packages':['Tkinter']}})
    

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

    虽然我觉得这个答案有点偏离主题,但我还是把它贴了出来,因为它回答了下面这个被标记为与本问题重复的问题(下面的链接)。
    实际上,我正在使用pyinstaller,但它有一个同样的选项(-w),并为我解决了这个问题。
    Snidhi Sofpro
    Snidhi Sofpro
    发布于 2021-05-29
    0 人赞同

    Mohsen Haddadi在本线程早些时候发布了一些额外的信息,用于需要win32gui解决方案的情况。

    As of python 361, win32gui & win32con are not part of the python std library. To use them, pywin32 package will need to be installed; now possible via pip.

    关于pywin32软件包的更多背景信息在。 How to use the win32gui module with Python? .

    另外,为了在关闭窗口时应用谨慎,以免无意中关闭前台的任何窗口,可以按照以下的思路扩展决议。

    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  :
        
    Why not just use the extension *.pyw? This is excessively long.
    在使用Cgi服务器(http.server)的情况下,使用.pyw扩展名可能不是一个解决方案。 因为,在这种情况下,尽管有.pyw扩展名,但Python脚本最终还是会被python.exe执行。
    不过在运行这个的时候,终端会短暂地弹出。
    啊,但如果你做了这样的事情呢。【替换代码0【替换代码1【替换代码2
    @Anonymous 你有时需要对控制台是否显示有更精细的控制。当我用Pyinstaller冻结一个程序时,我希望控制台在那里,这样我就可以在打包不成功的情况下读到错误,如果一切顺利,就可以隐藏控制台。
    Mohammad Al Jadallah
    Mohammad Al Jadallah
    发布于 2021-05-29
    0 人赞同

    写完代码后,你想把文件从 .py 转换成 .exe ,所以可能你会用 pyinstaller ,做 exe 的文件也不错。所以你可以通过这种方式隐藏控制台。

    pyinstaller --onefile main.py --windowed
    

    我习惯于这种方式,而且很有效。

    Vaibhav Shukla
    Vaibhav Shukla
    发布于 2021-05-29
    0 人赞同

    只需将文件扩展名从 .py 改为 .pyw

    mo-han
    mo-han
    发布于 2021-05-29
    0 人赞同

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

    def deco_factory_daemon_subprocess(*, flag_env_var_name='__this_daemon_subprocess__', **kwargs_for_subprocess):
        def deco(target):
            @functools.wraps(target)
            def tgt(*args, **kwargs):
                if os.environ.get(flag_env_var_name) == __file__:
                    target(*args, **kwargs)
                else:
                    os.environ[flag_env_var_name] = __file__
                    real_argv = psutil.Process(os.getpid()).cmdline()
                    exec_dir, exec_basename = path_split(real_argv[0])
                    if exec_basename.lower() == 'python.exe':
                        real_argv[0] = shutil.which('pythonw.exe')
                    kwargs = dict(env=os.environ, stdout=subprocess.PIPE, stderr=subprocess.PIPE, )
                    kwargs.update(kwargs_for_subprocess)
                    subprocess.Popen(real_argv, **kwargs)
            return tgt
        return deco
    

    use it like this:

    @deco_factory_daemon_subprocess()
    def run():