【问题标题】:How to install separately a python package and its dependencies using pip in order to allow separated pip options?如何使用 pip 单独安装 python 包及其依赖项以允许单独的 pip 选项?
【发布时间】:2019-10-14 15:38:49
【问题描述】:

我有一个 python 包(一个分支),它需要一个额外的选项才能安装。我发现这可以使用 pip 的--global-option 选项来完成:

pip install --global-option="cythonize" git+https://github.com/blaiseli/pybedtools.git@fix_missing_headers

但是,此选项会导致安装此包的依赖项失败,因为它也适用于它们,并且无法识别。

如何先单独安装依赖?

pip install --only-deps <some package> 之类的东西似乎不存在。


编辑

按照this answer 中的建议,我尝试在我的包的fork 中设置一个别名,以便在安装之前运行cythonize 命令:

$ cat setup.cfg 
[wheel]
universal = 1
[nosetests]
detailed-errors = 1
doctest-extension = .pyx .py
[aliases]
install = cythonize install

奇怪的是,cythonize 命令处理正确:

$ python3.7 setup.py cythonize
running cythonize
Compiling pybedtools/cbedtools.pyx because it changed.
Compiling pybedtools/featurefuncs.pyx because it changed.
[1/2] Cythonizing pybedtools/cbedtools.pyx
/usr/local/lib/python3.7/site-packages/Cython/Compiler/Main.py:369: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: /home/bli/src/pybedtools/pybedtools/cbedtools.pxd
  tree = Parsing.p_module(s, pxd, full_module_name)
[2/2] Cythonizing pybedtools/featurefuncs.pyx
/usr/local/lib/python3.7/site-packages/Cython/Compiler/Main.py:369: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: /home/bli/src/pybedtools/pybedtools/featurefuncs.pyx
  tree = Parsing.p_module(s, pxd, full_module_name)

但是当它是别名的一部分时无法识别:

$ python3.7 setup.py install
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
   or: setup.py --help [cmd1 cmd2 ...]
   or: setup.py --help-commands
   or: setup.py cmd --help

error: invalid command 'cythonize'

【问题讨论】:

  • 看起来你滥用了--global-option,但如果它对你有用,那就好。实际上cythonize 似乎不是一个setuptools 全局选项,它看起来更像是一个你想在install 命令之前运行的setuptools 命令。您是否尝试过在 setup.cfg 中设置 别名python setup.py alias install cythonize install

标签: python pip


【解决方案1】:

与您的其他 question 相同,我怀疑 cythonizesetuptools 命令,而不是 全局选项

如果确实如此,那么最好在setup.cfg 中设置一个别名。如果您运行python setup.py alias install cythonize install,这应该将以下内容添加到您的setup.cfg

[aliases]
install = cythonize install

稍后运行pip install 时,pip 将遵循此别名,并且cythonize 命令将在install 命令之前执行。

【讨论】:

  • 我不确定从 pip 的--global-option 选项的意义上来说,我得到的实际上是“全局选项”。就我而言,cythonize 确实是一个要传递给setup.py 的选项。在我看来,您提议的是对我尝试安装的 python 包的更改(我可以在该包的 fork 中尝试它,但如果包的官方维护者这样做会更好)。
  • setup.py 的命令行是 python setup.py [global options] command [command options]。例如python setup.py -q install -O2pip --global-optionssetup.py 配置全局选项。
  • 一定要在你的fork中试试这个别名,如果它确实增加了价值,那么建议上游项目的维护者进行更改。
  • 我尝试在我的 fork 包 (github.com/blaiseli/pybedtools/blob/auto_cythonize/setup.cfg) 的 setup.cfg 中添加您建议的行,但是当我运行 pip install git+https://github.com/blaiseli/pybedtools.git@auto_cythonize 时它似乎不起作用我得到一个error: invalid command 'cythonize'
  • @phd 从您的评论中我了解到cythonize 应该是setup.pycommand,而不是global optioncommand option。告诉 pip 在install 之前运行另一个命令的正确方法是什么?
【解决方案2】:

pip 在某种程度上支持带有内联选项的 requirements.txt 文件。所以你可以像这样使用requirements.txt

# ...
cython
git+https://github.com/blaiseli/pybedtools.git@fix_missing_headers --global-option="cythonize"
# ...

并像这样安装:

pip install --requirement requirements.txt

我说有点是因为它似乎仍然对安装其他要求有(显然没有破坏性)影响。特别是它似乎禁用了其他要求和依赖项的轮子,这对我来说没有意义。

【讨论】:

  • 全局禁用轮子的问题是pypa/pip#4118
  • @bli 是否有助于解决您的问题?
猜你喜欢
  • 2015-03-21
  • 2016-08-21
  • 2011-11-12
  • 2023-04-03
  • 2018-09-27
  • 2011-01-20
  • 2021-05-29
  • 1970-01-01
  • 2016-08-26
相关资源
最近更新 更多