【问题标题】:Executable path to Mac AppMac App 的可执行路径
【发布时间】:2011-05-16 13:36:36
【问题描述】:

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

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

Edit1:forking 是一个有限的选项,它可能不适用于与应用程序捆绑的第 3 方可执行文件+我需要在 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/ 这会打开应用程序,但我无法将参数传递给它,因为它们将是打开命令的参数,不会传递给我的应用程序

  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

结论:看起来不可能 Launch an app on OS X with command line

open 不排除参数。

【问题讨论】:

    标签: python macos py2app


    【解决方案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
    

    Multiprocessing in Python 显然也可以在 Windows 上运行,我想你会很感兴趣(?)。

    【讨论】:

    • 这是一个选项,但更简单的选项是单独执行它,因为我通常只运行后台进程进行测试+我可能会在用户输入的不同时间运行不同的后台进程,反正我更多有兴趣知道如何在不使代码复杂化的情况下运行我的后台进程或捆绑包中包含的任何其他应用程序
    • 我的问题很简单,如何使用子进程模块运行捆绑的 python 脚本
    • 好吧,您可能只需要弄清楚 py2app 是如何做到的,这应该不难。您想运行“python AppName.app/Contents/Resources/myapp.py”,而不是 OSX 二进制文件。
    • 分叉是很棒的顺便说一句,一旦你分叉了你就永远不会回头.. :-)
    【解决方案2】:

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

    【讨论】:

    • a) 我必须从主应用程序调用后台应用程序,快捷方式有什么帮助? b)如果我创建了两个应用程序,第一个应用程序如何知道第二个应用程序在哪里,以及如何使用参数调用应用程序?
    【解决方案3】:

    我无法让 py2app 工作,但应用程序的可执行文件位于 AppName.app/Contents/MacOS/AppName。您可以在AppName.app/Contents/Info.plist 文件中检查密钥&lt;key&gt;CFBundleExecutable&lt;/key&gt;,它指向AppName.app/Contents/MacOS 文件夹中的可执行包。

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

    如果您希望BackgroundApp 在不带任何参数的情况下运行后台进程,有两种选择: a) 从 python 脚本制作捆绑包,它在不带任何参数的情况下运行后台进程; b) 将Info.plist文件中的&lt;key&gt;CFBundleExecutable&lt;/key&gt;改成BackGroundApp_shell,并制作一个shell脚本Contents/MacOS/BackgroundApp_shell,内容如下:

    #!/bin/sh
    
    `dirname "$0"`/BackgroundApp --backgroundprocess
    

    假设可执行文件是BackgroundApp

    【讨论】:

    • 我已经尝试过AppName.app/Contents/MacOS/AppName --backgroundprocess之类的方法,但它失败了,看起来py2app或mac在执行应用程序之前设置了一些环境变量
    • @Anurag 您可以尝试为一个简单的 python 脚本制作一个包:import sys; print sys.argv 以查看 exec 创建的 py2app 如何处理命令行参数。我认为这与环境变量无关。只是一个猜测:py2app 创建一个不带参数的 exec,但你可以尝试这个简单的脚本,以确保。
    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2012-01-24
    • 2014-11-24
    • 2017-04-05
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    相关资源
    最近更新 更多