Вопрос

У меня есть библиотека под названием "example", которую я устанавливаю в свой глобальный каталог пакетов сайта.Тем не менее, я хотел бы иметь возможность установить две версии, одну для производства и одну для тестирования (у меня есть веб-приложение и другие вещи, которые имеют версию таким образом).

Есть ли способ указать, скажем, "python setup.py stage", который не только установит другое egg в пакеты сайта, но и переименует модуль из "example" в "example_stage" или что-то подобное?

Если distutils не может этого сделать, есть ли какой-нибудь другой инструмент, который может?

Это было полезно?

Решение

Конечно, вы можете расширить distutils новыми командами.В файле конфигурации distutil добавьте:

 [global]
 command-packages=foo.bar

это может быть в distutils.cfg в distutils сам пакет, ..pydistutils.cfg в вашем домашнем каталоге (без начальной точки в Windows) или setup.cfg в текущем каталоге.

Затем вам понадобится пакет foo.bar в каталоге site-packages вашего Python.

Затем в этот пакет вы добавляете классы, реализующие ваши новые желаемые команды, такие как stage, подкласс distutils.cmd -- документация слабая, но примеров достаточно, поскольку все существующие команды distutils также построены таким образом.

Другие советы

Это можно легко сделать с distutils, создав подкласс distutils.core.Команда внутри setup.py .

Например:

from distutils.core import setup, Command
import os, sys

class CleanCommand(Command):
    description = "custom clean command that forcefully removes dist/build directories"
    user_options = []
    def initialize_options(self):
        self.cwd = None
    def finalize_options(self):
        self.cwd = os.getcwd()
    def run(self):
        assert os.getcwd() == self.cwd, 'Must be in package root: %s' % self.cwd
        os.system('rm -rf ./build ./dist')  

Чтобы включить команду, вы должны сослаться на нее в setup():

setup(
     # stuff omitted for conciseness.
     cmdclass={
        'clean': CleanCommand
}

Обратите внимание, что вы также можете переопределить встроенные команды таким образом, как то, что я сделал с 'clean'.(Мне не понравилось, как встроенная версия оставила за собой каталоги 'dist' и 'build'.)

% python setup.py --help-commands | grep clean
  clean            custom clean command that forcefully removes dist/build dirs.

Существует ряд соглашений, которые используются:

  • Вы указываете любые аргументы командной строки с помощью параметры пользователя.
  • Вы объявляете любые переменные, которые вы бы использовали с initialize_options() инициализировать параметры () метод, который вызывается после инициализации, чтобы настроить ваше пользовательское пространство имен для подкласса.
  • Тот Самый finalize_options() метод вызывается непосредственно перед выполнить().
  • Суть самой команды будет заключаться в выполнить() так что не забудьте перед этим проделать любую другую подготовительную работу.

Лучший пример для использования - просто взглянуть на исходный код одной из команд по умолчанию, найденных по адресу PYTHON_DIR/distutils/команда такие , как install.py или build.py.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top