当前位置: 首页 > 知识库问答 >
问题:

setupool和pip依赖项解析之间的差异

田信然
2023-03-14

我最近开始用SetupTools打包我的第一个项目,并且大部分都很成功。

不幸的是,我遇到了一个令人困惑的情况——我的项目依赖于一个在PyPI上不可用的文件模块。我已经能够配置安装程序了。py使用dependency_links选项轻松地依赖于该模块,并且一切正常。。。只要我使用安装程序。请安装它。如果我尝试使用pip安装项目egg,则在尝试安装模块时失败,假设它必须是一个预先制作的egg归档文件。相比之下,设置。py检测到它是一个简单的源文件,并由此生成一个egg。

我的目标是让我的项目在PyPI上可用,所以它只需使用pip即可安装是很重要的;所以我的问题是。。。我做错什么了吗?

我的理解是,setuptools本质上是达到目的的一种手段,目的是pip和PyPI,因此这两种工具的行为如此不同,对我来说似乎很奇怪。

设置的相关部分。每个工具的py和输出如下所示:

setup(
    name='particle-fish',
    version='0.1.0',
    description='Python Boilerplate contains all the boilerplate you need to create a Python package.',
    long_description=readme + '\n\n' + history,
    author='Lachlan Pease',
    author_email='predatory.kangaroo@gmail.com',
    url='https://github.com/predakanga/particle-fish',
    packages=[
        'particle.plugins'
    ],
    include_package_data=True,
    install_requires=['particle', 'irccrypt', 'pycrypto'],
    dependency_links=['http://www.bjrn.se/code/irccrypt/irccrypt.py#egg=irccrypt-1.0'],
    license="BSD",
    zip_safe=False,
    keywords='particle-fish',
    classifiers=[
        'Development Status :: 2 - Pre-Alpha',
        'Intended Audience :: Developers',
        'License :: OSI Approved :: BSD License',
        'Natural Language :: English',
        "Programming Language :: Python :: 2",
        'Programming Language :: Python :: 2.6',
        'Programming Language :: Python :: 2.7',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.3',
    ],
    test_suite='tests',
    tests_require=['pytest', 'mock', 'coverage', 'pytest-cov'],
    cmdclass = {'test': PyTest},
)

setup.py安装输出:

Installed /Users/lachlan/.virtualenvs/particle-fish/lib/python2.7/site-packages/particle_fish-0.1.0-py2.7.egg
Processing dependencies for particle-fish==0.1.0
Searching for irccrypt
Best match: irccrypt 1.0
Downloading http://www.bjrn.se/code/irccrypt/irccrypt.py#egg=irccrypt-1.0
Processing irccrypt.py
Writing /var/tmp/easy_install-svPfHF/setup.cfg
Running setup.py -q bdist_egg --dist-dir /var/tmp/easy_install-svPfHF/egg-dist-tmp-Xq3OCt
zip_safe flag not set; analyzing archive contents...
Adding irccrypt 1.0 to easy-install.pth file

pip安装的输出:

Downloading/unpacking irccrypt (from particle-fish==0.1.0)
  Downloading irccrypt.py
  Cannot unpack file /private/var/tmp/pip-mCc6La-unpack/irccrypt.py (downloaded from /Users/lachlan/.virtualenvs/particle-staging/build/irccrypt, content-type: text/plain); cannot detect archive format
Cleaning up...
Cannot determine archive format of /Users/lachlan/.virtualenvs/particle-staging/build/irccrypt

共有1个答案

习淇
2023-03-14

你的问题分为两部分:

  1. 处理通过setup指定的dependency\u链接的正确方法是什么
  2. 为什么没有始终如一地处理这一问题

处理通过setup指定的dependency\u链接的正确方法是什么?

setupols留档对menthod的dependency_links参数说:

dependency\u链接
满足依赖关系时要搜索的命名URL的字符串列表。如果需要安装由setup\u requirestests\u require指定的软件包,将使用这些链接。它们还将被写入egg的元数据中,供EasyInstall等工具在安装时使用。egg文件。

现在,这是相当模糊的。他们确实提到了EasyInstall,因此我们可以深入研究那里的源代码,以确定它如何处理依赖性链接。Setuptools还记录了eggs的内部结构,其中包括依赖项链接。与设置依赖项链接参数对应的txt文件。它让我们更深入地了解链接的实际含义:

使用dependency\u链接setup()关键字指定的依赖项URL列表,每行一个。这些URL可以是直接下载URL,也可以是包含直接下载链接的网页的URL,EasyInstall将使用这些URL查找依赖项,就像用户通过--find links命令行选项手动提供它们一样。有关指定此选项的更多信息,以及有关EasyInstall如何处理--查找链接URL的信息,请参阅setuptools手册和EasyInstall手册。

(粗体强调)

这是有用的,因为它指出了应该如何处理这些问题,以及它实际上期望什么。这个描述比dependency_links描述稍微有用一点,因为它指定了要搜索的URL的实际含义:包含它们的直接下载链接或索引。源代码确认了--find-linkdependency_links在构建EasyInstall时实际上是合并的,因此我们现在可以查看EasyInstall的--find-link参数,以了解它所期望的内容。

--find-link=URLS_OR_FILENAMES,-fURLS_OR_FILENAMES
扫描指定的下载页面或目录,寻找到eges或其他发行版的直接链接。

这里有更详细的信息,但总体思路是--find links查找包含未找到的包的鸡蛋或档案。因此,答案的第一部分是:dependency\u links用于指向完整的包,而不是单个的未打包模块。

这听起来像是pip处理您所包含的链接的方式,当您通读所有内容时,这是有意义的。您可以通过查看pip的测试来确认这一点。pip有两个使用dependency\u links(1,2)的测试,这两个测试都假设dependency\u links指向索引页。这似乎符合setuptools的描述,其中dependency\u links是“命名要搜索的URL的字符串列表”。

因此,现在我们知道pip正在根据规范处理此问题,剩下第二个问题:

为什么要使用setuptools?

为了理解为什么用setupool工作,您需要了解setupool如何确定依赖项并尝试下载/安装它们。PackageIndex.download方法在任何外部URL上调用,并且需要在本地下载包才能安装。这个函数的docstring包含了我们问题的答案:

如果它是一个. py文件的URL,带有一个明确的#eges=name-version标记(即,一个将-转义为_< /code>的标记),一个琐碎的setup.py会在下载的文件旁边自动创建。

这就解释了为什么setuptools忽略了它不是发行版,但pip失败的事实。

TL; DR:dependency_links应该指向包含一个包或存档的包或存档,而不是未打包的模块。安装工具意识到你的痛苦并帮助你,但这大多是没有记录的。考虑重新打包模块,并在许可证允许的情况下将其包含在包中。

 类似资料:
  • 我正在处理另一个关于我的构建的问题。gradle需要理解我的Android项目中的工作区项目依赖关系。我已经使用Java和Android有一段时间了,但我仍然很容易对添加依赖项的所有不同方法感到困惑。一种方法是放一个标签。libs/文件夹中的jar文件。另一种方法是具有工作区项目依赖关系。另一种方法(如果使用Android)是在Android选项菜单中添加项目依赖项?我觉得如果我真的理解了为什么会

  • 当我试图导入依赖项时,我收到以下错误: 请帮帮我,我哪里错了? 事先谢谢你

  • 我是一名新的Android学习者,我正在为语言翻译制作我的第一个Android应用程序。在添加了一些依赖项之后,我遇到了一些问题。我该怎么解决这个问题? Gradle同步失败:无法解决配置的所有依赖项: app: dedegRuntimeClasspath。无法确定android.arch.lifecycle的工件: livedata: 1.1.1:脱机模式下没有缓存版本有关详细信息,请参阅IDE

  • 我给ivy添加了一个依赖项(我们称之为a)。在maven central中具有pom文件的xml。Ivy使用ibiblio来解析maven依赖项。添加到常春藤中的依赖项(A)。xml具有可传递依赖项(B)。到目前为止,一切都很好。传递依赖(B)的依赖(C)不能用常春藤来解决。 我在常春藤上定义了一个新的名字。如下所示的xml: 在B的pom文件中,C在编译和测试范围中定义如下: 当我在ivy的缓存

  • 我有个问题。 在pom.xml中,依赖项包含在两个地方。一个位置可以在标记中,另一个位置可以在标记中。 提前致谢:)

  • 我想使用hbase hortonworks连接器。github指南 但是我不知道如何在我的项目中导入它。我有以下build.sbt: 它给出了以下未解决的依赖关系: 错误:导入SBT项目时出错: [警告]==本地:尝试[警告]常春藤。xml[警告]==公共:已尝试[警告] https://repo1.maven.org/maven2/com/hortonworks/shc/1.1.2-2.1-s_