Python Mac应用程序的可执行路径

Python Mac应用程序的可执行路径,python,macos,py2app,Python,Macos,Py2app,在py2app/Mac应用程序包中,是否有方法通过传递不同的命令行参数,从应用程序内生成同一应用程序的另一个实例 或者给定一个mac应用程序包,我如何从命令行运行它并传递一些参数 Edit1:分叉是一个有限的选项,它可能无法与第三方可执行文件捆绑在一起,我需要在mac和windows上运行它。 Edit2:问题是如何使用子流程模块运行捆绑的python脚本 细节: 我正在使用py2app为我的应用程序生成应用程序包。我的申请分为两部分 MainApp:哪个是用户界面 BackgroundApp:

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

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

Edit1:分叉是一个有限的选项,它可能无法与第三方可执行文件捆绑在一起,我需要在mac和windows上运行它。
Edit2:问题是如何使用子流程模块运行捆绑的python脚本

细节: 我正在使用py2app为我的应用程序生成应用程序包。我的申请分为两部分

  • MainApp:哪个是用户界面
  • BackgroundApp:一个后台进程,它完成真正的工作
  • MainApp和BackgroundApp都是作为python脚本实现的,实际上它们是同一个python脚本,具有不同的命令行,例如

    python myapp.py
    python myapp.py --backgroundprocess
    
    所以,当我运行
    python myapp.py
    时,它会根据程序路径自动启动后台进程,但由于我现在已将我的应用捆绑为py2app,我不确定应该调用并传递什么可执行文件
    --backgroundprocess
    选项

    我试过的
  • $open MyApp.app/
    这将打开应用程序,但我无法将参数传递给它,因为它们将是open命令的参数,不会传递给我的应用程序

  • $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
    
    回溯(最近一次呼叫最后一次):
    文件“/Users/agyey/projects/myapp/release4.26/py2exe/dist/myapp.app/Contents/Resources/run.py”,第4行,在
    从renderprocess导入RenderEngineApp
    文件“renderprocess/RenderEngineApp.pyc”,第6行,在
    文件“wx/uuuu init_uuuuu.pyc”,第45行,在
    文件“wx/_core.pyc”,第4行,在
    文件“wx/_core.pyc”,第18行,在
    文件“wx/_core.pyc”,第11行,在加载中
    ImportError:dlopen(/Users/agyey/projects/myapp/release4.26/py2exe/dist/myapp.app/Contents/Resources/lib/python2.5/lib dynload/wx/_core_u.so,2):库未加载:@executable_path/。/Frameworks/libwx_macud-2.8.0.dylib
    引用自:/Users/agyey/projects/myapp/release4.26/py2exe/dist/myapp.app/Contents/Resources/lib/python2.5/lib dynload/wx/_core_u2;so
    原因:不兼容的库版本:_core_.so需要7.0.0或更高版本,但libwx_macud-2.8.0.dylib提供了2.6.0版本
    
    结论:看起来这是不可能的


    open
    不排除参数。

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

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

    因此,您可以将其命名为
    AppName.app/Contents/MacOS/AppName--backgroundprocess

    如果您想让
    BackgroundApp
    在没有任何参数的情况下运行后台进程,有两个选项:a)从python脚本生成捆绑包,该脚本在没有任何参数的情况下运行后台进程;b) 将
    Info.plist
    文件中的
    CFBundleExecutable
    更改为
    BackGroundApp\u shell
    ,并制作一个包含以下内容的shell脚本
    Contents/MacOS/BackGroundApp\u shell

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

    假设可执行文件是
    BackgroundApp

    如何查找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)上执行此操作的老方法


    很明显,windows上也可以使用,我想你们会感兴趣(?。

    a)我必须从主应用程序调用后台应用程序,快捷方式有什么帮助?b) 如果我创建了两个应用程序,第一个应用程序如何知道第二个应用程序在哪里,以及如何调用带有参数的应用程序?我已经尝试了类似于
    AppName.app/Contents/MacOS/AppName--backgroundprocess
    的方法,但失败了,看起来py2app或mac在执行app@Anurag您可以尝试为一个简单的python脚本制作一个包:
    importsys;打印sys.argv
    ,查看exec创建的py2app如何处理命令行参数。我不认为这是关于环境变量的事情。猜猜看:py2app创建了一个不带参数的exec,但你可以试试这个简单的脚本来确保。这是一个选项,但更简单的选项是单独执行它,因为我通常只运行后台进程进行测试+我可能在不同的时间对用户输入运行不同的后台进程,无论如何,我更感兴趣的是知道如何在不使代码复杂化的情况下运行我的后台进程或捆绑包中包含的任何其他应用程序。我的问题很简单,如何使用子进程模块运行捆绑的python脚本。您可能只需了解py2app是如何做到这一点的,这应该不会太难。您想运行“python AppName.app/Contents/Resources/myapp.py”,而不是OSX二进制文件。顺便说一句,分叉非常棒,一旦分叉,您将永远不会回头看..-)
    #!/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