1

在我的setup.py我定义了一个这样的入口点:

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

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

更新:

使用“免费”控制台,我的意思是我想从命令提示符启动脚本(即将命令行参数传递给它),但希望在 gui 启动后命令提示符可用。像这样的东西:

Last login: Mon Oct  8 15:34:28 on ttys002
localhost:~ domma$ cofo some arguments
... gui starts and after that ...
localhost:~ domma$ 

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

4

3 回答 3

2

使用 linux/unix(包括 Mac OS X)shell,您可以运行命令,并通过使用“&”作为后缀来告诉它进入后台。例如:

$ cofo some arguments &

这是一个包含一些额外信息的页面:http ://www.bsdguides.org/guides/netbsd/beginners/job_control/print

我建议只是手动使用它/教育你的用户使用它(如果他们已经在使用 cli,那么这并不是很多额外的要求。)如果你真的希望你的命令默认进入后台,你可以用使用上述方法的小 bash 脚本包装您的脚本。

于 2012-10-08T15:07:24.027 回答
0

以下最小示例适用于我使用 Windows 7 32 位、Python 2.7.1、wx 2.8.12.2 (msw-unicode)。python setup.py develop调用时,分别为cofo.exe控制台cofogui.exe和 GUI 脚本生成 和 。

执行时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'
              ]
          }
      )

cofo/__init__.py:

#!/usr/bin/env python

import wx

def gui_main():
    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()

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

如果这必须是完全在 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()
于 2012-10-08T12:49:39.447 回答
0

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

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

# Your program starts here (child process)

请注意,此代码与 distutils 无关。您的程序将充当守护程序。

于 2012-10-09T06:51:01.637 回答