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

时间:2013-09-10 17:16:27

标签: python pip setuptools

我正在使用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”传入的内容的值?

5 个答案:

答案 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 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(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