我正在使用pip 1.4.1,尝试从本地路径安装软件包,例如:
pip install /path/to/my/local/package
这就是我想要的,这或多或少相当于运行python /path/to/my/local/package/setup.py install
,但我想将一些额外的选项/参数传递给我的软件包的setup.py install。
我理解from the pip documentation使用--install-option
选项可以实现这一点,例如:
pip install --install-option="--some-option" /path/to/my/local/package
来自python-virtualenv谷歌集团的This post表明这是可能的。
我不明白如何从setup.py中获取传入的“--some-option”。我试着查看sys.argv
,但无论我为“--install-option =”添加什么,sys.argv
总是这样:
['-c', 'egg_info', '--egg-base', 'pip-egg-info']
如何从pip install中获取作为“--install-option”传入的内容的值?
答案 0 :(得分:7)
您需要使用自己的自定义命令扩展install命令。在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"
答案 1 :(得分:4)
效果很好,也documented。
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"
缺少等号会导致众所周知的错误:
错误:选项 - 启动rabbitmq无法识别
答案 2 :(得分:3)
为了保持一致性,您可以在setup.py install
和setup.py develop
(又名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(self)
# 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(self)
def run(self):
# Use options
global someopt
someopt = self.someopt # will be 1 or None
super().run(self)
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" .
答案 3 :(得分:1)
我在安装pyside时遇到了这个问题。
我需要指定--qmake
选项。
这是您需要的表格:
pip install --install-option="--qmake=/usr/lib64/qt4/bin/qmake" PySide
答案 4 :(得分:0)
在此great anwser之上。 需要注意的另一件事是--install-options并非work with wheel
从7.0版开始,pip支持通过需求文件控制为setup.py提供的命令行选项。由于setup.py不存在轮子,因此该软件包无法使用轮子(缓存或其他方式)。
但是,当您使用curr_zipp = []
for s, sublists in enumerate(list2):
for e in range(len(sublists)):
if 'and' in sublists[e]:
if e== 1 :
root_elem = sublists[e - 1]
split_elem = sublists[e].split('and')
curr_zipp.append((root_elem,split_elem[0]))
curr_zipp.append((root_elem,split_elem[1]))
elif e ==0:
root_elem = sublists[e -1]
split_elem = sublists[e].split('and')
curr_zipp.append((split_elem[0],root_elem))
curr_zipp.append((split_elem[1],root_elem))
制作轮子时,可以使用
setup.py
要自定义安装阶段,这将影响wheel软件包的python setup.py bdist_wheel install -your-options
。