6

在 py2app/Mac 应用程序包中,有没有办法通过传递不同的命令行参数从应用程序中生成同一个应用程序的另一个实例?

或者给定一个 mac 应用程序包,我如何从命令行运行它并传递一些参数?

Edit1:forking 是一个有限的选项,它可能不适用于与应用程序捆绑的 3rd 方可执行文件+我需要在 mac 和 windows 上运行它。
Edit2:问题是如何使用子进程模块运行捆绑的 python 脚本

细节:

我正在使用 py2app 为我的应用程序生成一个应用程序包。我的应用程序有两个部分

  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 应用程序

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

创建一个应用程序,然后为该应用程序调用 --bakgroundproccess,然后为 backgroundprocess 标志创建一个快捷方式。或两个不同的应用程序文件。以太币是个好方法

于 2010-11-29T14:29:05.913 回答
0

我无法让 py2app 工作,但应用程序的可执行文件位于AppName.app/Contents/MacOS/AppName. 您可以签入AppName.app/Contents/Info.plist文件中的 key <key>CFBundleExecutable</key>,它指向文件夹中的 bundles 可执行AppName.app/Contents/MacOS文件。

所以你可以称它为AppName.app/Contents/MacOS/AppName --backgroundprocess.

如果你想在BackgroundApp没有任何参数的情况下运行后台进程,有两种选择:a)从 python 脚本制作包,它在没有任何参数的情况下运行后台进程;b) 将文件更改<key>CFBundleExecutable</key>Info.plistsay ,并制作以下​​内容BackGroundApp_shell的 shell 脚本:Contents/MacOS/BackgroundApp_shell

#!/bin/sh

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

假设可执行文件是BackgroundApp.

于 2010-11-29T14:31:54.367 回答