Как получить аргументы, переданные 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