6

py2app/Mac アプリケーション バンドルでは、異なるコマンド ライン引数を渡すことによって、アプリ内から同じアプリの別のインスタンスを生成する方法はありますか?

または、Mac アプリ バンドルが与えられた場合、コマンド ラインから実行していくつかの引数を渡すにはどうすればよいですか?

Edit1:forking は制限付きのオプションであり、サード パーティの実行可能ファイルと app+I がバンドルされている場合は機能しない可能性があります。Mac と Windows でこれを実行する必要があります。
Edit2:サブプロセス モジュールを使用して、バンドルされた python スクリプトを実行する方法を質問します。

詳細:

私は py2app を使用して、アプリケーション用のアプリ バンドルを生成しています。私のアプリケーションには 2 つの部分があります

  1. MainApp: これは UI です
  2. BackgroundApp: 実際の仕事を行うバックグラウンド プロセス

MainApp と BackgroundApp の両方が python スクリプトとして実装されており、実際には、コマンドラインが異なる同じ python スクリプトです。

python myapp.py
python myapp.py --backgroundprocess

したがって、実行python myapp.pyすると、プログラムパスに基づいてバックグラウンドプロセスが自動的に開始されますが、アプリを py2app としてバンドルしたため、どの実行可能ファイルを呼び出して--backgroundprocessオプションを渡す必要があるかわかりませんか?

私が試したこと

  1. $ open MyApp.app/これによりアプリが開きますが、引数を渡すことはできません。引数はopenコマンドの引数になり、アプリに渡されないためです

  2. $ MyApp.app/Contents/MacOS/MyApp --backgroundprocessアプリを開きますが、引数がアプリに渡されていないように見えるため、背景プロセスは開きません

また、エラーをスローします

  Traceback (most recent call last):
  File "/Users/agyey/projects/myapp/release4.26/py2exe/dist/MyApp.app/Contents/Resources/run.py", line 4, in <module>
    from renderprocess import RenderEngineApp
  File "renderprocess/RenderEngineApp.pyc", line 6, in <module>
  File "wx/__init__.pyc", line 45, in <module>
  File "wx/_core.pyc", line 4, in <module>
  File "wx/_core_.pyc", line 18, in <module>
  File "wx/_core_.pyc", line 11, in __load
ImportError: dlopen(/Users/agyey/projects/myapp/release4.26/py2exe/dist/MyApp.app/Contents/Resources/lib/python2.5/lib-dynload/wx/_core_.so, 2): Library not loaded: @executable_path/../Frameworks/libwx_macud-2.8.0.dylib
  Referenced from: /Users/agyey/projects/myapp/release4.26/py2exe/dist/MyApp.app/Contents/Resources/lib/python2.5/lib-dynload/wx/_core_.so
  Reason: Incompatible library version: _core_.so requires version 7.0.0 or later, but libwx_macud-2.8.0.dylib provides version 2.6.0

結論: できないよう です OS X でコマンドラインからアプリを起動する

open引数を除外しません。

4

3 に答える 3

1

cwd を見つけて提供された任意のバイナリを実行する方法 まずバイナリを AppName.app/Contents/Resources に配置し、Python スクリプトから次のコードを実行します。

import subprocess
process=subprocess.Popen((os.getcwd() + "/3rd_party_binary","--subprocess")) 
process.poll() # is running?

Python アプリの 2 つのバージョンを適切に生成する方法

Fork は、MacOSX (unix) でこれを行うための古くから試みられた方法です。

#!/usr/bin/env python
import os, sys

pid = os.fork()
if pid:
    # we are the parent
    background_process.start()
    os.waitpid(pid, 0) # make sure the child process gets cleaned up
else:
    # we are the child
    gui_app.start()
    sys.exit(0)

print "parent: got it; text =", txt

Python でのマルチプロセッシングは、どうやら Windows でも機能するようで、興味深いと思います (?)。

于 2010-12-02T00:46:48.607 に答える
0

1つのアプリケーションを作成し、そのアプリの--bakgroundproccessを呼び出してから、backgroundprocessフラグのショートカットを作成します。または2つの異なるアプリファイル。エーテルは良い方法です

于 2010-11-29T14:29:05.913 に答える
0

py2app を動作させることができませんでしたが、アプリケーションの実行可能ファイルはAppName.app/Contents/MacOS/AppName. AppName.app/Contents/Info.plistkey のファイルをチェックインできます。これは、フォルダー内<key>CFBundleExecutable</key>の実行可能なバンドルを指します。AppName.app/Contents/MacOS

したがって、次のように呼び出すことができますAppName.app/Contents/MacOS/AppName --backgroundprocess

引数なしでバックグラウンド プロセスを実行する場合はBackgroundApp、次の 2 つのオプションがあります。a) 引数なしでバックグラウンド プロセスを実行する Python スクリプトからバンドルを作成します。b)ファイルを sayに変更<key>CFBundleExecutable</key>し、次の内容のシェル スクリプトを作成します。Info.plistBackGroundApp_shellContents/MacOS/BackgroundApp_shell

#!/bin/sh

`dirname "$0"`/BackgroundApp --backgroundprocess

実行可能ファイルがBackgroundApp.

于 2010-11-29T14:31:54.367 に答える