Pip 可以在安装时安装 setup.py 中未指定的依赖项吗?
Posted
技术标签:
【中文标题】Pip 可以在安装时安装 setup.py 中未指定的依赖项吗?【英文标题】:Can Pip install dependencies not specified in setup.py at install time? 【发布时间】:2011-05-08 05:12:45 【问题描述】:当用户发出安装原始软件的命令时,我希望 pip 安装我在 GitHub 上的依赖项,同样来自 GitHub 上的源代码。这些包都没有在 PyPi 上(永远不会)。
用户发出命令:
pip -e git+https://github.com/Lewisham/cvsanaly@develop#egg=cvsanaly
这个 repo 有一个 requirements.txt
文件,另一个依赖于 GitHub:
-e git+https://github.com/Lewisham/repositoryhandler#egg=repositoryhandler
我想要的是一个单个命令,用户可以发出来安装原始包,让 pip 找到需求文件,然后也安装依赖项。
【问题讨论】:
【参考方案1】:This answer 帮助我解决了你所说的同样的问题。
setup.py 似乎没有一种简单的方法可以直接使用需求文件来定义其依赖项,但是可以将相同的信息放入 setup.py 本身。
我有这个 requirements.txt:
PIL
-e git://github.com/gabrielgrant/django-ckeditor.git#egg=django-ckeditor
但是在安装 requirements.txt 包含的包时,pip 会忽略这些要求。
这个 setup.py 似乎强制 pip 安装依赖项(包括我的 github 版本的 django-ckeditor):
from setuptools import setup
setup(
name='django-articles',
...,
install_requires=[
'PIL',
'django-ckeditor>=0.9.3',
],
dependency_links = [
'http://github.com/gabrielgrant/django-ckeditor/tarball/master#egg=django-ckeditor-0.9.3',
]
)
编辑:
This answer 还包含一些有用的信息。
需要将版本指定为“#egg=...”的一部分,以确定链接中可用的软件包版本。 不过,请注意,如果您总是想依赖最新版本,您可以在 install_requires、dependency_links 和其他包的 setup.py 中将版本设置为 dev
编辑:使用dev
作为版本不是一个好主意,根据下面的 cmets。
【讨论】:
使用“dev”的技巧只在第一次有效,以后无效。 setup.py 只检查“dev”字符串作为自己的版本 @DanEEStar 没错。一旦安装了 dev 版本的软件包setuptools
将认为满足要求。正如 in the linked answer 演示的那样,您需要在 所有 3 个位置 同步更新包版本:依赖项的 setup.py
和 install_requires
和 dependency_links
- 不太实用。
是的,@DanEEStar 你是对的。我已经编辑了使用“开发”版本的建议。谢谢你们两个!【参考方案2】:
这是我用来从需求文件生成install_requires
和dependency_links
的小脚本。
import os
import re
def which(program):
"""
Detect whether or not a program is installed.
Thanks to http://***.com/a/377028/70191
"""
def is_exe(fpath):
return os.path.exists(fpath) and os.access(fpath, os.X_OK)
fpath, _ = os.path.split(program)
if fpath:
if is_exe(program):
return program
else:
for path in os.environ['PATH'].split(os.pathsep):
exe_file = os.path.join(path, program)
if is_exe(exe_file):
return exe_file
return None
EDITABLE_REQUIREMENT = re.compile(r'^-e (?P<link>(?P<vcs>git|svn|hg|bzr).+#egg=(?P<package>.+)-(?P<version>\d(?:\.\d)*))$')
install_requires = []
dependency_links = []
for requirement in (l.strip() for l in open('requirements')):
match = EDITABLE_REQUIREMENT.match(requirement)
if match:
assert which(match.group('vcs')) is not None, \
"VCS '%(vcs)s' must be installed in order to install %(link)s" % match.groupdict()
install_requires.append("%(package)s==%(version)s" % match.groupdict())
dependency_links.append(match.group('link'))
else:
install_requires.append(requirement)
【讨论】:
【参考方案3】:这能回答你的问题吗?
setup(name='application-xpto',
version='1.0',
author='me,me,me',
author_email='xpto@mail.com',
packages=find_packages(),
include_package_data=True,
description='web app',
install_requires=open('app/requirements.txt').readlines(),
)
【讨论】:
open('app/requirements.txt').readlines()
仅在 requirements.txt
仅包含“普通”版本规范而非 URL 时才有效。这些需要按照 Simon Charette 的回答在 dependency_links
中拆分。以上是关于Pip 可以在安装时安装 setup.py 中未指定的依赖项吗?的主要内容,如果未能解决你的问题,请参考以下文章
ERROR:命令错误,退出状态1:python setup.py egg_info检查日志以获取完整的命令输出。在安装pip时安装keplergl