Развертывание приложения Python с общим пакетом - PullRequest
2 голосов
/ 30 ноября 2008

Я думаю, как организовать развернутое приложение Python, которое будет иметь

  1. Исполняемый скрипт, расположенный в / usr / bin /, который предоставит CLI для функциональности, реализованной в
  2. Библиотека, установленная там, где находится текущий каталог site-packages.

Сейчас у меня в источниках следующая структура каталогов:

foo.py
foo/
  __init__.py
  ...

что, я думаю, не самый лучший способ сделать что-то. Во время разработки все работает как положено, однако при развертывании код «from foo import FooObject» в foo.py, по-видимому, пытается импортировать сам foo.py, а это не то поведение, которое я ищу.

Итак, вопрос в том, какова стандартная практика организации подобных ситуаций? Одна из вещей, о которых я мог подумать, это при установке переименовать foo.py в просто foo, что мешает ему импортировать себя, но это выглядит довольно неловко ...

Другая часть проблемы, я полагаю, заключается в том, что это проблема с именами. Возможно, вызовите исполняемый скрипт foo-bin.py?

Ответы [ 4 ]

5 голосов
/ 02 декабря 2008

Эта статья довольно хороша и показывает вам хороший способ сделать это. Второй пункт из списка Do отвечает на ваш вопрос.

бесстыдная копировальная паста:

Структура файловой системы проекта Python

от Jp Calderone

У

  • назовите каталог, связанный с вашим проектом. Например, если ваш Проект называется "Twisted", назовите каталог верхнего уровня для его источника файлы Twisted. Когда вы делаете релизы, Вы должны включить номер версии суффикс: Twisted-2.5.
  • создайте каталог Twisted/bin и поместите туда свои исполняемые файлы, если вы есть какой-либо. Не давай им .py расширение, даже если они Python исходные файлы. Не вставляйте код в их, кроме импорта и вызова основная функция определена где-то еще в ваших проектах.
  • Если ваш проект может быть выражен как один исходный файл Python, поместите его в каталог и назовите его что-то связанное с вашим проектом. За Например, Twisted/twisted.py. если ты нужно несколько исходных файлов, создайте пакет вместо (Twisted/twisted/, с пустым Twisted/twisted/__init__.py) и место ваши исходные файлы в нем. Например, Twisted/twisted/internet.py.
  • поместите ваши юнит-тесты в подпакет вашего пакета (обратите внимание - это означает что единственный исходный файл Python вариант выше был трюк - ты всегда нужен как минимум еще один файл для вашего юнит тесты). Например, Twisted/twisted/test/. Конечно, сделать это пакет с Twisted/twisted/test/__init__.py. Поместите тесты в файлы, такие как Twisted/twisted/test/test_internet.py.
  • добавить Twisted/README и Twisted/setup.py, чтобы объяснить и установить программное обеспечение, соответственно, если тебе хорошо.

Не

  • поместите ваш источник в каталог с именем src или lib. Это затрудняет запускать без установки.
  • поместите ваши тесты вне вашего пакета Python. Это затрудняет запустить тесты против установленного версия.
  • создайте пакет, который имеет только __init__.py, а затем поместите весь ваш код в __init__.py. Просто сделайте модуль вместо пакета это проще.
  • попытайтесь придумать магические хаки, чтобы Python мог импортировать ваш модуль или пакет без добавления пользователя каталог, содержащий его для их путь импорта (либо через PYTHONPATH, либо через какой-то другой механизм). Ты не будешь правильно обрабатывать все случаи и пользователей разозлится на тебя, когда твой программное обеспечение не работает в их окружающая среда.
2 голосов
/ 30 ноября 2008

Distutils поддерживает установку модулей, пакетов и скриптов. Если вы создаете distutils setup.py, который ссылается на foo как пакет и foo.py как на скрипт, тогда foo.py должен быть установлен на /usr/local/bin или на любой другой путь установки скрипта, который находится на целевой ОС, пакет foo должен быть установлен в каталог site_packages.

0 голосов
/ 30 ноября 2008

Ваш CLI-модуль - это одно, а пакет, который его поддерживает, - это другое. Не путайте имена с модулем foo (в файле foo.py) и пакетом foo (в каталоге foo с файлом __init__.py).

У вас есть две вещи с именем foo: модуль и пакет. Что еще вы хотите назвать foo? Класс? Функция? Переменная?

Укажите отличительное имя для модуля foo или пакета foo. Например, foolib - это популярное имя пакета.

0 голосов
/ 30 ноября 2008

Вы должны вызывать исполняемый файл просто foo, а не foo.py, тогда попытки импорта foo не будут его использовать.

Что касается правильного наименования: на этот вопрос трудно ответить абстрактно; нам нужно знать, что конкретно он делает. Например, если он конфигурирует и управляет, может быть уместно назвать его -config или ctl. Если это API оболочки для библиотеки, оно должно иметь то же имя, что и библиотека.

...