【问题标题】:Use setuptools to install from location使用 setuptools 从位置安装
【发布时间】:2023-11-17 04:06:01
【问题描述】:

我有一个网站框架,我想在多个项目中使用,但我不想将我的框架提交给 PyPi。无论如何我可以告诉我的 setup.py 从特定位置安装框架吗?

这是我当前的 setup.py

from setuptools import setup

setup(
    name='Website',
    version='0.2.1',
    install_requires=[
        'boto>=2.6',
        'fabric>=1.4',
        'lepl>=5.1',
        'pygeoip>=0.2.4',
        'pylibmc>=1.2.3',
        'pymongo>=2.2',
        'pyyaml>=3.1',
        'requests>=0.12',
        'slimit>=0.7.4',
        'thrift>=0.8.0',
        'tornado>=2.3',
    ],
)

这些依赖项实际上是我的框架的所有依赖项,所以如果我能以某种方式包含它,我只能在此处列出框架。

【问题讨论】:

    标签: python setuptools pypi


    【解决方案1】:

    看起来您的所有需求都是公开的(在 PyPI 上),您不需要它们的特定版本,只需“足够新”即可。在 2016 年,当您可以指望每个人都拥有pip 的最新版本时,真的无事可做。如果您只是来自源目录的pip install .pip install git+https://url/to/package 或类似的,它只会从网上拉取最新版本的依赖项。你的包不在 PyPI 上这一事实不会阻止 pip 在那里找到它的依赖项。

    或者,如果您想将它们全部存储在本地,您可以设置一个本地 PyPI 索引。虽然在这种情况下,将包推送到同一个本地索引并从那里安装可能会更简单。

    如果您需要更复杂的事情,requirements file 可以为您处理。

    特别是,如果您需要将包分发给组织中可能没有设置您团队的本地索引的其他人,或者由于某种原因您一开始就无法设置本地索引,您可以将所有必要的信息放在需求文件中——或者,如果更合适的话,放在用于安装你的包的命令行上(即使你被easy_installpip 的旧版本卡住,它也可以工作)。

    文档提供了完整的细节,this blog post 很好地解释了它,但简短的版本是这样的:

    • 如果您有本地 PyPI 索引,请提供 --extra-index-url=http://my.server/path/to/my/pypi/

    • 如果你有一个 HTTP 服务器可以将包放到上面,并且你可以在你的服务器中启用“自动索引目录内容”选项,只需提供--find-links=http://my.server/path/to/my/packages/

      李>
    • 如果您想使用本地文件(或 SMB/AFP/等文件共享),请创建一个简单的 HTML 文件,其中只包含指向所有本地包的链接,并提供 --find-links=file:///path/to/my/index.html

    同样,这些可以在“安装这个包,运行这个”(或curl | sh 安装脚本)的命令行上进行,但通常你只是想把它们放在一个需求文件中。如果是这样,请确保每个选项只使用一个值(例如,如果要添加两个额外的索引,请添加两个 --extra-index-url 参数)并将每个值放在自己的行中。

    需求文件还允许您指定每个包的特定版本,因此您可以确保人们使用您开发和测试的相同代码进行部署,这在这些情况下通常很有用。

    【讨论】:

    • @Tommy 嗯,问题和答案是 3-1/2 岁。如果您想查找更新的链接并编辑答案,请随时这样做。如果您认为整个答案已经过时以至于应该重写(如果我今天回答的话,我什至不会提到 easy_install ..:),您可以编写一个新答案。 (我不认为 OP 会回来,其他人可能会通过搜索找到它,就像您可能所做的那样,如果您的回答对他们有​​帮助,那就太好了。
    • @Tommy 现在我想了想,我不确定这个问题是否相关。现在您可以指望每个拥有 pip 5+ 的人,“pip install”。或“pip install git+url/to/package”应该只与 OP 的安装文件一起使用,并且比安装需求文件然后在这个包上执行“python setup.py install”更好。因此,最好写一个新答案或大幅编辑这个答案......
    • 不,这个答案仍然相关。如果您在一家托管内部 pypi 服务器的大公司,但希望人们能够安装包含托管在该服务器上的 deps 的软件包,而无需他们知道该服务器存在,您只需将 extra-index-urls 放入您的包的 requirements.txt 文件。另请注意,并非所有内容都托管在 git 上。
    • 您对本地 PyPi 索引的编辑仍然有点错过我提到的关键点。许多大公司拥有一个或多个内部 PyPi 存储库。您的软件包可能依赖于这些服务器。但是,如果另一个用户出现并想要安装您的包,可能托管在公司的源代码控制站点上,您不希望他们必须知道您的所有依赖项在哪里。这就是你的 requirements.txt 中的--extra-index-url 如此有用的原因。您程序的所有用户都可以 pip 您的包,而无需知道这些详细信息。