30

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

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

这就是我想要的,这或多或少相当于 running python /path/to/my/local/package/setup.py install,但我想将一些额外的选项/参数传递给我的包的 setup.py 安装。

从 pip 文档中了解到,使用该--install-option选项可以做到这一点,例如:

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

python-virtualenv Google Group 的这篇文章表明这​​是可能的。

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

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

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

4

5 回答 5

22

您需要使用自己的自定义命令扩展安装命令。在该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"

于 2015-10-18T16:52:54.330 回答
9

为了保持一致性,您可以为两者添加一个选项setup.py installsetup.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,
    }

然后,您可以将选项传递给 pip,例如:

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

或在开发模式下:

pip install -e --install-option="--someval=1" .
于 2018-12-18T13:18:48.250 回答
6

它运行良好,并且还记录在案

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 无法识别

于 2018-04-02T10:58:12.770 回答
1

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

我需要指定--qmake选项。

这是您需要的表格:

pip install --install-option="--qmake=/usr/lib64/qt4/bin/qmake" PySide
于 2014-11-03T16:35:29.200 回答
-1

在这个伟大的 anwser 之上。还要注意的一件事是--install-options不适用于 wheel

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

但是,当您使用 构建轮子时setup.py,您可以使用

python setup.py bdist_wheel install -your-options

自定义安装阶段,这将影响.dist-info轮子包的。

于 2020-05-04T18:48:27.013 回答