我正在开发一个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行)中完成了