Python 如何使用'--安装选项';?

Python 如何使用'--安装选项';?,python,pip,setuptools,Python,Pip,Setuptools,我正在使用pip 1.4.1,试图从本地路径安装程序包,例如: pip install /path/to/my/local/package pip install --install-option="--some-option" /path/to/my/local/package 这就是我想要的,这或多或少相当于运行python/path/to/my/local/package/setup.py install,但我想向我的包的setup.py install传递一些附加选项/参数 我知道这

我正在使用pip 1.4.1,试图从本地路径安装程序包,例如:

pip install /path/to/my/local/package
pip install --install-option="--some-option" /path/to/my/local/package
这就是我想要的,这或多或少相当于运行
python/path/to/my/local/package/setup.py install
,但我想向我的包的setup.py install传递一些附加选项/参数

我知道这可以通过
--install选项实现,例如:

pip install /path/to/my/local/package
pip install --install-option="--some-option" /path/to/my/local/package
来自pythonvirtualenv的谷歌小组建议这是可能的

我不明白的是如何从setup.py中获取传入的“-some选项”。我试着查看
sys.argv
,但无论我为“-install option=”,添加了什么,
sys.argv
始终是这样的:

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

如何从pip install获取作为“-install option”传入的值?

我在安装pyside时遇到了这个问题

我需要指定
--qmake
选项

这是您需要的表格:

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

您需要使用自己的自定义命令扩展install命令。在
run
方法中,可以将选项的值公开到
setup.py
(在我的示例中,我使用了一个全局变量)

使用
setup
功能注册自定义安装命令

setup(
    cmdclass={
        'install': InstallCommand,
    },
    :
看来你的论点顺序不对

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

它运行良好,而且也可以

但这种方式是错误的: 缺少等号会导致众所周知的错误:

错误:选项--无法识别rabbitmq引擎


为了保持一致性,您可以向
setup.py安装
setup.py开发
(也称为
pip安装-e
):(根据Ronen Botzer的答案构建)

或在开发模式下:

pip install -e --install-option="--someval=1" .
除此之外。 还有一件事需要注意的是,这并不重要

由于版本7.0,pip支持通过需求文件控制给定给setup.py的命令行选项。这将禁用对该软件包使用控制盘(缓存或其他),因为不存在用于控制盘的setup.py

但是,当您使用
setup.py
构建控制盘时,可以使用

python setup.py bdist\u wheel安装-您的选项

自定义安装阶段,这将影响车轮组件的
.dist info

谢谢回答。不久前,我发现了解决这个问题的其他方法,所以我把它放在一边,但我会试试看。我记得,我认为它不起作用;安装本地软件包与从PyPI安装软件包之间存在一些差异,但我可能弄错了。此选项
--qmake
与项目
PySide
相关。要添加自定义选项,您需要注册
setuptools.command.install
(和/或
.develope
)的派生类来管理它(如上面的答案中所述)。顺便说一下,一旦您对install命令进行子类化,您应该能够在
sys.argv
。只是为了澄清一下,在setup(…)如何使用cmdclass技术访问传入的变量?cmdclass设置有一个选项。没有它,pip会抱怨,不会执行该操作。它将传递给setup.py,在那里您可以检查sys.argv中的选项值。顺便说一句,在
user\u options
中使用下划线似乎是被禁止的:
distutils.errors.DistutilsGetoptError:无效的长选项名称“some\u option”(必须是字母、数字、连字符)
对,我试图使用注释掉的代码的“some_val”版本,结果是
错误:选项--someval未被识别
。尽管
python setup.py install-h
显示新标志被识别。这根本不起作用,pip接受了opt离子并将它们发送到/dev/null:(相关:我想发送include_dirs和library_dirs来构建我的模块,以前我会在setup()中填充include_dirs和library_dirs,现在该怎么做?@Rika不会通过install命令来完成这项工作。相反,请看
pip install . --install-option="--engine rabbitmq"
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" .