Как получить аргументы, переданные setup.py из pip с помощью опции "--install-option"?

Я использую pip 1.4.1, пытаясь установить пакет из локального пути, например:

pip install /path/to/my/local/package

Это делает то, что я хочу, что более или менее эквивалентно запуску python /path/to/my/local/package/setup.py install, но я хотел бы передать некоторые дополнительные параметры/аргументы для установки пакета setup.py.

Я понимаю из документации по протоколу, что это возможно с помощью опции --install-option, например:

pip install --install-option="--some-option" /path/to/my/local/package

Этот пост из группы python-virtualenv Google предполагает, что это возможно.

Я не понимаю, как получить переданную "-some-option" из setup.py. Я попытался посмотреть sys.argv, но независимо от того, что я положил для "--install-option =", sys.argv всегда это:

['-c', 'egg_info', '--egg-base', 'pip-egg-info']

Как я могу получить значения вещей, переданных как "--install-option" из pip install?

Ответ 1

Вам нужно расширить команду установки с помощью собственной пользовательской команды. В методе run вы можете указать значение параметра setup.py (в моем примере я использую глобальную переменную).

from setuptools.command.install import install


class InstallCommand(install):
    user_options = install.user_options + [
        ('someopt', None, None), # a 'flag' option
        #('someval=', None, None) # an option that takes a value
    ]

    def initialize_options(self):
        install.initialize_options(self)
        self.someopt = None
        #self.someval = None

    def finalize_options(self):
        #print("value of someopt is", self.someopt)
        install.finalize_options(self)

    def run(self):
        global someopt
        someopt = self.someopt # will be 1 or None
        install.run(self)

Зарегистрируйте пользовательскую команду установки с помощью функции setup.

setup(
    cmdclass={
        'install': InstallCommand,
    },
    :

Кажется, что порядок ваших аргументов выключен

pip install /path/to/my/local/package --install-option="--someopt"

Ответ 2

Это работает хорошо и также задокументировано.

from setuptools.command.install import install

class InstallCommand(install):             
    user_options = install.user_options + [
        ('engine=', None, '<description for this custom option>'),
    ]                                      

    def initialize_options(self):          
        install.initialize_options(self)   
        self.engine = None  

    def finalize_options(self):                   
        print("value of engine is", self.engine)
        install.finalize_options(self)            

    def run(self):                                
        print(self.engine)                       
        install.run(self)                         

setup(
...
cmdclass={'install': InstallCommand}
...
)

Одной из распространенных ошибок является передача setup настройки в pip, как если бы вы передавали их непосредственно в setup. Используйте параметры из pip:

pip install . --install-option="--engine=rabbitmq"

Но этот путь неправильный:

pip install . --install-option="--engine rabbitmq"

Отсутствие знака равенства вызывает общеизвестную ошибку:

ошибка: опция --engines rabbitmq не распознана

Ответ 3

Для согласованности вы можете добавить опцию как в setup.py install и в setup.py develop pip install -e (он же pip install -e): (построение ответа Ronen Botzer)

from setuptools import setup
from setuptools.command.install import install
from setuptools.command.develop import develop


class CommandMixin(object):
    user_options = [
        ('someopt', None, 'a flag option'),
        ('someval=', None, 'an option that takes a value')
    ]

    def initialize_options(self):
        super().initialize_options()
        # Initialize options
        self.someopt = None
        self.someval = 0

    def finalize_options(self):
        # Validate options
        if self.someval < 0:
            raise ValueError("Illegal someval!")
        super().finalize_options()

    def run(self):
        # Use options
        global someopt
        someopt = self.someopt # will be 1 or None

        super().run()

class InstallCommand(CommandMixin, install):
    user_options = getattr(install, 'user_options', []) + CommandMixin.user_options

class DevelopCommand(CommandMixin, develop):
    user_options = getattr(develop, 'user_options', []) + CommandMixin.user_options

setup(
    ...,
    cmdclass={
        'install': InstallCommand,
        'develop': DevelopCommand,
    }

Затем вы можете передать параметры в пункт:

pip install --install-option="--someval=1" --install-option="--someopt" .

Или в режиме разработки:

pip install -e --install-option="--someval=1" .

Ответ 4

У меня возникла проблема с установкой pyside.

Мне нужно было указать опцию --qmake.

Это форма, в которой вы нуждаетесь:

pip install --install-option="--qmake=/usr/lib64/qt4/bin/qmake" PySide