Как создать точку входа в пакет / приложение Conda? - PullRequest
0 голосов
/ 30 апреля 2018

Я занимаюсь разработкой приложения на Python и использую Conda для его распространения и управления зависимостями.

Я успешно запустил conda-build, чтобы свернуть мой код в файл .tar.bz2. Я создал новую среду conda и протестировал установку пакета. Все работает, и я могу запустить свой код таким образом.

Что меня интересует, так это как мне структурировать мой пакет и / или код Python, чтобы я мог запускать свой сценарий, просто печатая с активной средой conda, а не переходя в папку, где я разработал код?

Например, в этом листе conda: https://conda.io/docs/_downloads/conda-cheatsheet.pdf, четвертая строка сверху "Запустите пакет после установки, пример Spyder", команда для запуска просто "spyder".

Моя программа на Python запускается из одного файла .py, launch.py, но как мне сообщить conda, какой скрипт вызывать? Когда я делаю это сейчас, он просто говорит «команда не найдена».

Этот раздел в спецификации метаданных представляется актуальным: https://conda.io/docs/user-guide/tasks/build-packages/define-metadata.html#entry-point

Я попытался установить для него значение "entry: python launch.py" в моем meta.yaml, перестроить и переустановить, но это не сработало, и я не уверен, куда идти.

Любая помощь будет принята с благодарностью, спасибо.

Редактировать: После дальнейших раскопок я, возможно, нашел ответ, кажется, я хочу создать точку входа, как описано здесь: https://setuptools.readthedocs.io/en/latest/setuptools.html#dynamic-discovery-of-services-and-plugins Хотя все еще пытаюсь собрать все это вместе.

1 Ответ

0 голосов
/ 01 мая 2018

Допустим, ваша структура пакета выглядит примерно так:

my_package/
├── my_package/
│   ├── __init__.py
|   ├── __main__.py
├── conda.recipe/
│   ├── meta.yaml
├── setup.py

Рецепт conda в meta.yaml не нужно помещать в папку conda.recipe, это просто удобно, если вы хотите сохранить рецепт вместе с остальным кодом. Теперь, в __main__.py, у вас есть некоторый код, который вы хотите вызвать (этот код может быть в любом модуле, __main__.py является удобным примером, потому что код там также выполняется, если вы запускаете python -m my_package). Код в __main__.py может выглядеть как

import sys
# Import whatever else from your package or otherwise to run the code

def main(argv):
    # Process command line arguments, etc

if __name__ == '__main__':
    sys.exit(main())

Теперь в вашем meta.yaml будет что-то вроде:

package:
  name: my_package
  version: '1.0.0'

source:
  path: ..

build:
  number: 0
  script: python setup.py install --single-version-externally-managed --record=record.txt
  entry_points:
    - my_package_script = my_package.__main__:main

requirements:
  - ...

Ключевая строка - my_package_script = my_package.__main__:main. Синтаксис здесь такой же, как для setup.py точек входа:

script name = package name.module name:function name

Итак, в нашем примере мы используем функцию main из модуля __main__.py в пакете my_package.

Для полного примера, вы можете взглянуть на мою посылку здесь: https://github.com/bryanwweber/CanSen

...