区别:创建在启动wx应用程序时不“阻止”控制台的脚本

2024-05-15 09:54:26 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的setup.py中,我定义了一个如下的入口点:

entry_points={
      'console_scripts' : [
            'cofo = cofo:gui_main'
      ]
},

调用python setup.py develop按预期生成cofo脚本。但是gui_main启动了一个wxWindows应用程序,我想在之后“释放”控制台。我怎么能做到呢?如果我使用gui_scripts而不是console_scripts,这不会有什么不同。

更新:

对于“free”控制台,我的意思是我希望从命令提示符启动脚本(即向其传递命令行参数),但希望在gui启动后命令提示符可用。像这样:

^{pr2}$

目前我没有得到等待提示,因为脚本正在运行并“阻塞”命令行。我的主要平台是OSX,但我对一个通用的解决方案感兴趣。


Tags: 命令行py脚本定义mainsetupscriptsgui
3条回答

发生这种情况是因为shell正在等待进程完成。看起来你在寻找类似于守护进程的东西。为此,可以使用os.fork()创建进程的副本,然后用sys.exit()终止主进程(父进程)。在

if os.fork():
    # Finish the parent process    
    sys.exit()

# Your program starts here (child process)

请注意,此代码与distutils无关。这是你的程序将作为一个守护程序。在

下面的最小示例适用于我使用Windows7332位、Python2.7.1、WX2.8.12.2(MSWUnicode)。当调用python setup.py develop时,分别为控制台和GUI脚本生成cofo.exe和{}。在

执行cofogui.exe时,不会出现控制台窗口(这是您所说的“免费”控制台吗?)在

本例使用setuptoolsdistutils的增强。在

setup.py:

#!/usr/bin/env python

from setuptools import setup

setup(name='cofo',
      packages=['cofo'],
      entry_points={
          'console_scripts' : [
              'cofo = cofo:gui_main'
              ],
          'gui_scripts' : [
              'cofogui = cofo:gui_main'
              ]
          }
      )

以及

^{pr2}$

更新: 基于Windows和Unix的平台在启动进程时运行方式不同。在Unix系统上,如果应用程序要在后台运行,通常的过程是使用os.fork()系统调用。如anotheranswer中所述,这可以在应用程序外部完成,方法是编写一个包装器脚本,为您做后台处理。在

如果这必须是一个完全用Python编写的通用解决方案,那么如下所示应该可以满足您的需要:

cofo/__init__.py:

#!/usr/bin/env python

import os
import wx

def main_app():
    app = wx.App(False)  # Create a new app, don't redirect stdout/stderr to a window.
    frame = wx.Frame(None, wx.ID_ANY, "Hello World") # A Frame is a top-level window.
    frame.Show(True)     # Show the frame.
    app.MainLoop()

def gui_main():
    """Start GUI application.

    When running on Unix based platform, fork and detach so that terminal from
    which app may have been started becomes free for use.
    """
    if not hasattr(os, 'fork'):
        main_app()
    else:
        if os.fork() == 0:
            main_app()

对于linux/unix(包括macosx)shell,您可以运行一个命令,并通过在其后面加上“&;”后缀来告诉它转到后台。例如:

$ cofo some arguments &

这是一个页面,其中有一些关于这个的额外信息:http://www.bsdguides.org/guides/netbsd/beginners/job_control/print

我建议您只需手动使用该命令/指导您的用户使用该命令(如果他们已经在使用a cli,那么这就不需要多问了。)如果您确实希望命令在默认情况下进入后台,那么可以使用一个使用上述方法的小型bash脚本来包装脚本。在

相关问题 更多 >