Связать инструмент python в приложении Cocoa с помощью easy_install

Мое приложение Cocoa требует, чтобы инструмент командной строки Python был установлен в системе пользователя с помощью easy_install. В идеале я хотел бы связать один файл bash с моим приложением, которое я затем могу запустить. Но, насколько мне известно, это невозможно, потому что пакеты устанавливаются в каталог Python «site-packages».

Есть ли способ создать «пакет» этих файлов? Если нет, то как запустить установку easy_install? Я хотел связать файл .pkg с моим приложением, которое я мог бы затем открыть, если это необходимо, но я не смог позволить этому установочному пакету запускать только скрипт.

Если есть идеи, как это исправить, буду рад.

С уважением, Фабиан


person Fabian Kreiser    schedule 14.01.2012    source источник
comment
Не могли бы вы поставить инструмент командной строки вместе с вашим приложением? Кто будет использовать инструмент командной строки: только ваше приложение или, возможно, сам пользователь?   -  person Eric O Lebigot    schedule 14.01.2012


Ответы (2)


Если вы можете отправить инструмент командной строки вместе с вашим приложением, и если его будет использовать только ваше приложение (вместо инструмента, используемого непосредственно пользователем), вы можете напрямую включить и использовать инструмент командной строки с вашим приложением следующим образом:

  • Сохраните инструмент командной строки где-нибудь в каталоге вашего приложения.
  • Установите путь поиска модуля 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: если многим программам требуется доступ к модулю инструмента командной строки, вы можете:

  • Либо поместите приведенный выше код в каждую из ваших программ,

  • #P6#
    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 *
    
    #P7#
    from my_runner import main
    

PPS: если вам нужен более надежный путь, который будет работать, даже если рабочий каталог позже изменится, можно преобразовать потенциально локальный путь в абсолютный с помощью: path.join(path.abspath(path.dirname(__file__)),….

person Eric O Lebigot    schedule 14.01.2012
comment
Думаю, это то, что мне нужно. Просто для уточнения: где мне нужно изменить пути импорта? У меня есть около 10 файлов .py и один интерфейс командной строки с этим оператором импорта: from ino.runner import main Что именно мне нужно изменить? Большое спасибо! - person Fabian Kreiser; 14.01.2012
comment
Есть также некоторые зависимости, которые мне нужно отправить вместе с приложением. То же самое, что вы описали, работает и здесь? Если вам это поможет, инструмент python можно скачать здесь: pypi.python.org/packages/source/i/ino/ - person Fabian Kreiser; 14.01.2012
comment
Спасибо за ваш отзыв. Я добавил PS, который дает вам простое в обслуживании решение. - person Eric O Lebigot; 14.01.2012
comment
Извините, но я ничего не вижу. :-/ - person Fabian Kreiser; 14.01.2012
comment
@FabianKreiser: Да, я написал комментарий первым и оскорбительно использовал в нем прошедшее время. :) - person Eric O Lebigot; 14.01.2012
comment
Я постараюсь сделать то, что вы сказали. В моем инструменте командной строки мне нужно изменить импорт на относительный путь, а во всех других файлах .py мне также нужно настроить импорт. Как насчет внешних зависимостей? Как мне сослаться на файлы .egg? Прости, что так раздражаю. ;) - person Fabian Kreiser; 14.01.2012
comment
@FabianKreiser: Я рад, что ты продолжаешь задавать вопросы. :) Насчет внешних зависимостей не уверен. Я предполагаю, что вы можете поместить их в каталог внутри вашего проекта (через easy_install или, лучше, pip), а затем просто соответствующим образом настроить путь к библиотеке Python (выполнив как в ответе для каждой из ваших программ, если вы хотите чтобы пользователь мог разместить ваше приложение в любом месте на диске). - person Eric O Lebigot; 14.01.2012
comment
@FabianKreiser: PS: я понимаю, что вы хотите, чтобы все ваши зависимости знали друг о друге. Изменение переменной PYTHONPATH в вашей основной программе перед импортом (модуль os.environ) может быть самым простым решением. У меня нет большого опыта в этом, так что вы можете поэкспериментировать. :) - person Eric O Lebigot; 14.01.2012

Благодаря 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 из теперь независимого модуля Python, используя setup.py

  3. Ссылка на полученный файл .egg в инструменте командной строки, как в 1.
  4. Объедините один файл .egg и инструмент командной строки в приложении Cocoa.

Я надеюсь, что это будет полезно для кого-то.

person Fabian Kreiser    schedule 14.01.2012