使用easy_install在Cocoa应用程序中捆绑python工具

时间:2012-01-14 09:15:13

标签: python macos cocoa easy-install packagemaker

我的Cocoa应用程序需要使用easy_install在用户系统上安装Python命令行工具。理想情况下,我想将一个bash文件与我的应用程序捆绑在一起然后运行。但据我所知这是不可能的,因为软件包安装在Python的“site-packages”目录中。

有没有办法创建这些文件的“包”? 如果没有,我应该如何运行easy_install安装?我想用我的应用程序捆绑一个.pkg文件,然后我可以在必要时打开它,但是我无法让这个安装包只运行脚本。

如果您对如何解决这个问题有所了解,我会很高兴。

亲切的问候, 费边

2 个答案:

答案 0 :(得分:4)

如果您可以随应用程序发送命令行工具,并且只有您的应用程序将使用它(而不是用户直接使用的工具),您可以直接在您的应用程序中包含和使用命令行工具像这样:

  • 将命令行工具存储在应用程序目录中的某个位置。
  • 设置Python模块搜索路径,以便它查找所需的模块。

可以使用

设置相对于Python程序的Python模块搜索路径
import sys
import os.path as path

sys.path.append(path.join(path.dirname(__file__),
    '<relative path between this program and the command line tool module>'))

import <command line tool module>

可以使用..父目录约定来编写相对路径:这适用于Unix(包括Mac OS X)和Windows。

PS :如果许多程序需要访问命令行工具模块,您可以:

  • 将上述代码放在每个程序中

  • 或者,如果您希望更容易维护,可以创建自己的模块my_runner并将其用作代理:您的模块my_runner将导入所有原始runner像这样的函数:

    import sys
    import os.path as path
    
    sys.path.append(path.join(path.dirname(__file__),
        '<relative path between this program and the original ino module>'))
    
    from ino.runner import *
    

    然后,只需对您自己的my_runner模块执行“正常”导入,即可通过代理在所有程序中使用原始运行程序模块:

    from my_runner import main
    

PPS :如果您想要一个更健壮的路径,即使工作目录稍后更改也能正常工作,则可以将潜在的本地路径转换为绝对路径:path.join(path.abspath(path.dirname(__file__)),…

答案 1 :(得分:2)

感谢EOL,我现在就开始工作了。该解决方案涉及以下几个步骤。

  1. 通过打包.egg文件并按照以下方式引用它们来删除依赖项:

    import sys
    import os.path as path
    sys.path.append(path.join(path.dirname(__file__), '<relative path to .egg file>'))
    
    from dependency import something
    
  2. 使用.egg

  3. 从现在独立的python模块构建单个setup.py文件
  4. .egg
  5. 中的命令行工具中引用生成的1.文件
  6. 捆绑单个.egg文件和Cocoa应用程序中的命令行工具
  7. 我希望这对某人有用。