如何从'--install-option'获取从pip传递给setup.py的参数?

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"


Qua*_*um7 8

为了保持一致性,您可以为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,
    }
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)


I15*_*159 5

它运作良好,并已记录在案

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)

常见错误之一是setupsetup直接将其传递给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)