不要将自定义setup.py——install-option传播到依赖项



我正在开发一个python包,我想在其中提供自定义——install-option标志,以便跳过一些用户已经提供的安装步骤。

为了做到这一点,我遵循了这个线程中的说明:

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

现在,这最初似乎工作,但只是因为我的所有需求在requirements.txt中已经存在。

当我从干净安装中重试时,——install-选项也被传播到任何依赖包的安装调用,然后安装失败。

我的开关在这种情况下是——skipRLibraries。下面是我用来安装包的命令:

 pip install -vvv . --global-option="--skipRLibraries"

它收集所有依赖项,并在开始安装它们时立即失败:

 Installing collected packages: joblib, pysam, pybedtools, sortedcontainers, intervaltree, python-dateutil, pytz, numpy, pandas, biopython, Cython, slamdunk
 Running setup.py install for joblib ... error
Complete output from command /usr/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-OhpiVV/joblib/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('rn', 'n'), __file__, 'exec'))" --skipRLibraries install --record /tmp/pip-0Ca3kV-record/install-record.txt --single-version-externally-managed --compile:
usage: -c [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
   or: -c --help [cmd1 cmd2 ...]
   or: -c --help-commands
   or: -c cmd --help
error: option --skipRLibraries not recognized
----------------------------------------
 Command "/usr/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-OhpiVV/joblib/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('rn', 'n'), __file__, 'exec'))" --skipRLibraries install --record /tmp/pip-0Ca3kV-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-OhpiVV/joblib/

这是我的安装命令扩展名:

from setuptools.command.install import install as _install
class install(_install):
user_options = _install.user_options + [
    ('externalNGM', None, None),
    ('externalSamtools', None, None),
    ('skipRLibraries', None, None)
]
def initialize_options(self):
    _install.initialize_options(self)
    self.externalNGM = None
    self.externalSamtools = None
    self.skipRLibraries = None
def finalize_options(self):
    _install.finalize_options(self)
def run(self):
    global externalNGM, externalSamtools
    externalNGM = self.externalNGM
    externalSamtools = self.externalSamtools
    skipRLibraries = self.skipRLibraries
    #from subprocess import call
    #call(["pip install -r requirements.txt --no-clean"], shell=True)
    _install.run(self)
    self.execute(_runExternalBuilds, (self.install_lib, externalNGM, externalSamtools, skipRLibraries),msg="Installing external dependencies")

当然,我把它添加到我的setup():

    cmdclass={'install': install},

任何想法如何限制标志只到我的实际模块的安装?

编辑:

我在Github上的pip问题部分也遇到了这个问题:

https://github.com/pypa/pip/issues/1883

唯一的解决方案是首先安装所有要求的软件包,然后使用install标志重新安装它:PIP安装PIP install——no-deps——force- install——upgrade——install-option="——do-some-magic" foo

但是这是a)超级愚蠢和b)并不真正适用于我的模块,因为它默认自带外部软件,开关意味着跳过这个外部模块的安装。因此,在再次删除它之前,我会先重新安装它。

我知道这是一个老问题,但我最近一直在探索它,并且…似乎没有好的解决方案来发布带有自定义user_options的包,因为这会传播。

"workaround"将这些值通过环境变量传递给您的自定义安装命令。

from setuptools.command.install import install as _install
class install(_install):
def run(self):
    _install.run(self)
    self.execute(
        _runExternalBuilds,
        (
            self.install_lib, 
            os.environ.get("EXTERNAL..."),
            os.environ.get("SKIP_R"),
        ),
        msg="Installing external dependencies"
    )

并在调用包时设置这些变量。

EXTERNAL...=True, SKIP_R=False pip install .

这已经在Pyspark https://github.com/apache/spark/blob/master/python/setup.py(第128行)中完成了

最新更新