dja*_*ude 17 python pip setuptools
我正在使用pip 1.4.1,尝试从本地路径安装包,例如:
pip install /path/to/my/local/package
Run Code Online (Sandbox Code Playgroud)
这就是我想要的,这或多或少等同于运行python /path/to/my/local/package/setup.py install,但我想将一些额外的选项/参数传递给我的软件包的setup.py install.
我从pip文档中了解到,这可以通过--install-option选项实现,例如:
pip install --install-option="--some-option" /path/to/my/local/package
Run Code Online (Sandbox Code Playgroud)
来自python-virtualenv谷歌集团的这篇文章表明这是可能的.
我不明白的是如何从setup.py中获取传入的"--some-option".我试着看sys.argv,但无论我为"--install-option ="投入什么,sys.argv总是如此:
['-c', 'egg_info', '--egg-base', 'pip-egg-info']
Run Code Online (Sandbox Code Playgroud)
如何从pip install中获取作为"--install-option"传入的内容的值?
Ron*_*zer 10
您需要使用自己的自定义命令扩展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)
Run Code Online (Sandbox Code Playgroud)
使用该setup功能注册自定义安装命令.
setup(
cmdclass={
'install': InstallCommand,
},
:
Run Code Online (Sandbox Code Playgroud)
似乎你的论点的顺序是关闭的
pip install /path/to/my/local/package --install-option="--someopt"
为了保持一致性,您可以为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()
# 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,
}
Run Code Online (Sandbox Code Playgroud)
然后您可以将选项传递给 pip,例如:
pip install --install-option="--someval=1" --install-option="--someopt" .
Run Code Online (Sandbox Code Playgroud)
或者在开发模式下:
pip install -e --install-option="--someval=1" .
Run Code Online (Sandbox Code Playgroud)
它运作良好,并已记录在案。
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}
...
)
Run Code Online (Sandbox Code Playgroud)
常见错误之一是setup像setup直接将其传递给pip一样传递选项。使用像这样的pip选项:
pip install . --install-option="--engine=rabbitmq"
Run Code Online (Sandbox Code Playgroud)
pip install . --install-option="--engine rabbitmq"
Run Code Online (Sandbox Code Playgroud)
缺少等号会导致众所周知的错误:
错误:无法识别选项--engines rabbitmq
小智 1
我在安装 pyside 时遇到了这个问题。
我需要指定该--qmake选项。
这是您需要的表格:
pip install --install-option="--qmake=/usr/lib64/qt4/bin/qmake" PySide
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8477 次 |
| 最近记录: |