Как модулировать приложение Python - PullRequest
5 голосов
/ 02 февраля 2009

У меня есть несколько скриптов, которые используют общие определения. Как мне разделить их на несколько файлов? Кроме того, приложение не может быть установлено каким-либо образом в моем сценарии; должно быть возможным одновременное выполнение произвольного числа версий, и оно должно работать без прав суперпользователя. Решения, которые я придумал:

  • Дубликат кода в каждом скрипт. Грязный и, наверное, худший схема.
  • Поставь все скрипты и общие код в одном каталоге, и используйте from . import, чтобы загрузить их. Недостатком этого подхода является то, что Я хотел бы поместить свои библиотеки в другие каталог, чем приложения.
  • Положить общий код в своем собственном каталоге , напишите __init__.py, который импортирует все подмодули и, наконец, используйте from . import для их загрузки. Сохраняет код организованным, но для поддержки __init__.py и уточнения имен требуется немного ресурсов.
  • Добавить каталог библиотеки в sys.path и import. Я склонен это, но я не уверен, возиться с sys.path хороший код.
  • Загрузка с использованием execfile (exec в Python 3). Сочетает в себе преимущества два предыдущих подхода: только один нужна строка на модуль, и я могу использовать посвященный. С другой стороны, это уклоняется от концепции модуля Python и расширяет глобальное пространство имен.
  • Написать и установить модуль, используя distutils. Это устанавливает библиотеку для всех питонов скрипты и нужны права суперпользователя и влияет на другие приложения и, следовательно, не применимо в моем случае.

Какой метод самый лучший?

Ответы [ 5 ]

8 голосов
/ 02 февраля 2009

Добавление в sys.path (обычно с использованием site.addsitedir) встречается довольно часто и не особенно осуждается. Конечно, вы захотите, чтобы ваши общие рабочие ресурсы были в модулях где-то удобно.

Если вы используете Python 2.6+, уже есть папка модулей пользовательского уровня, которую вы можете использовать без добавления в sys.path или PYTHONPATH. Это ~ / .local / lib / python2.6 / site-packages для Unix-лайков - для получения дополнительной информации см. PEP 370 .

4 голосов
/ 02 февраля 2009

Вы можете установить переменную окружения PYTHONPATH для каталога, в котором находятся файлы вашей библиотеки. Это добавляет этот путь к пути поиска в библиотеке, и вы можете использовать обычный import для их импорта.

3 голосов
/ 02 февраля 2009

Если у вас есть несколько сред, которые имеют различные комбинации зависимостей, хорошим решением будет использование virtualenv для создания изолированных сред Python в изолированной среде, каждая из которых имеет собственный набор установленных пакетов. Каждая среда будет работать так же, как и общесистемная установка пакетов сайта Python, но для создания локальной среды не требуются права суперпользователя.

Google имеет много информации , но это выглядит довольно неплохой отправной точкой.

1 голос
/ 02 февраля 2009

Я использовал третий подход (добавьте каталоги к sys.path) для более чем одного проекта, и я думаю, что это правильный подход.

1 голос
/ 02 февраля 2009

Другой альтернативой ручного добавления пути к sys.path является использование переменной среды PYTHONPATH.

Кроме того, distutils позволяет указать пользовательский каталог установки с помощью

 python setup.py install --home=/my/dir 

Однако ни один из них не может быть практичным, если вам нужно одновременно запустить несколько версий с одинаковыми именами модулей. В этом случае вам, вероятно, лучше всего изменить sys.path.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...