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 を含む) シェルでは、コマンドを実行し、"&" をサフィックスとしてバックグラウンドに移行するように指示できます。例えば:

$ 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呼び出されると、コンソールスクリプトとGUIスクリプトの両方に対してcofo.exeとがそれぞれ生成されます。cofogui.exe

cofogui.exe実行されると、コンソールウィンドウは表示されません(これは「無料」コンソールの意味ですか?)

この例では、setuptoolsの拡張機能を使用していdistutilsます。

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 に答える