442

是否可以使用本地文件系统中的 pip 安装软件包?

我已经python setup.py sdist为我的包运行了,它创建了适当的 tar.gz 文件。该文件存储在我的系统上/srv/pkg/mypackage/mypackage-0.1.0.tar.gz

现在在虚拟环境中,我想安装来自 pypi 或来自特定本地位置的软件包/srv/pkg

这可能吗?

PS 我知道我可以指定pip install /srv/pkg/mypackage/mypackage-0.1.0.tar.gz。这将起作用,但我正在谈论使用该/srv/pkg位置作为 pip 搜索的另一个地方,如果我键入pip install mypackage.

4

12 回答 12

528

关于什么::

pip install --help
...
  -e, --editable <path/url>   Install a project in editable mode (i.e. setuptools
                              "develop mode") from a local project path or a VCS url.

例如,pip install -e /srv/pkg

其中 /srv/pkg 是可以找到“setup.py”的顶级目录。

于 2013-11-18T09:10:41.790 回答
191

我很确定您正在寻找的东西称为--find-links选项。

你可以做

pip install mypackage --no-index --find-links file:///srv/pkg/mypackage
于 2013-02-22T19:32:09.880 回答
56

我正在安装pyfuzzy,但不在 PyPI 中;它返回消息:No matching distribution found for pyfuzzy

我尝试了接受的答案

pip install  --no-index --find-links=file:///Users/victor/Downloads/pyfuzzy-0.1.0 pyfuzzy

但它也不起作用并返回以下错误:

忽略索引:https : //pypi.python.org/simple 收集 pyfuzzy 找不到满足 pyfuzzy 要求的版本(来自版本:)没有找到 pyfuzzy 的匹配分布

最后,我在那里找到了一个简单的好方法: https ://pip.pypa.io/en/latest/reference/pip_install.html

Install a particular source archive file.
$ pip install ./downloads/SomePackage-1.0.4.tar.gz
$ pip install http://my.package.repo/SomePackage-1.0.4.zip

所以以下命令对我有用:

pip install ../pyfuzzy-0.1.0.tar.gz.

希望它可以帮助你。

于 2015-09-01T11:38:43.623 回答
55

安装包页面,您可以简单地运行:

pip install /srv/pkg/mypackage

其中/srv/pkg/mypackage是包含setup.py的目录。


另外1,您可以从存档文件安装它:

pip install ./mypackage-1.0.4.tar.gz

1 虽然在问题中注明,但由于其受欢迎程度,也包括在内。

于 2019-08-28T18:24:25.530 回答
24

这是我最终使用的解决方案:

import pip


def install(package):
    # Debugging
    # pip.main(["install", "--pre", "--upgrade", "--no-index",
    #         "--find-links=.", package, "--log-file", "log.txt", "-vv"])
    pip.main(["install", "--upgrade", "--no-index", "--find-links=.", package])


if __name__ == "__main__":
    install("mypackagename")
    raw_input("Press Enter to Exit...\n")

我从pip install examples以及Rikard's answer on another question拼凑起来。“--pre”参数允许您安装非生产版本。“--no-index”参数避免搜索 PyPI 索引。“--find-links=.” 参数在本地文件夹中搜索(这可以是相对的或绝对的)。我使用“--log-file”、“log.txt”和“-vv”参数进行调试。“--upgrade”参数允许您安装较旧版本的较新版本。

我还找到了卸载它们的好方法。当您有多个不同的 Python 环境时,这很有用。这是相同的基本格式,只是使用“卸载”而不是“安装”,并采取了安全措施来防止意外卸载:

import pip


def uninstall(package):
    response = raw_input("Uninstall '%s'? [y/n]:\n" % package)
    if "y" in response.lower():
        # Debugging
        # pip.main(["uninstall", package, "-vv"])
        pip.main(["uninstall", package])
    pass


if __name__ == "__main__":
    uninstall("mypackagename")
    raw_input("Press Enter to Exit...\n")

本地文件夹包含以下文件:install.py、uninstall.py、mypackagename-1.0.zip

于 2014-10-15T23:17:08.780 回答
18

一个选项--find-links可以完成这项工作,它可以从requirements.txt文件中工作!

您可以将包档案放在某个文件夹中,并在不更改需求文件的情况下获取最新的档案,例如requirements

.
└───requirements.txt
└───requirements
    ├───foo_bar-0.1.5-py2.py3-none-any.whl
    ├───foo_bar-0.1.6-py2.py3-none-any.whl
    ├───wiz_bang-0.7-py2.py3-none-any.whl
    ├───wiz_bang-0.8-py2.py3-none-any.whl
    ├───base.txt
    ├───local.txt
    └───production.txt

现在requirements/base.txt说:

--find-links=requirements
foo_bar
wiz_bang>=0.8

一种更新专有软件包的巧妙方法,只需将新软件包放入文件夹中

通过这种方式,您可以使用相同的单个调用从local folderAND安装软件包:pypipip install -r requirements/production.txt

PS。请参阅我的 cookiecutter-djangopackage fork 以了解如何拆分需求和使用基于文件夹的需求组织。

于 2017-07-11T10:55:47.523 回答
10

假设你有 virtualenv 和一个requirements.txt文件,那么你可以在这个文件中定义获取包的位置:

# Published pypi packages 
PyJWT==1.6.4
email_validator==1.0.3
# Remote GIT repo package, this will install as django-bootstrap-themes
git+https://github.com/marquicus/django-bootstrap-themes#egg=django-bootstrap-themes
# Local GIT repo package, this will install as django-knowledge
git+file:///soft/SANDBOX/python/django/forks/django-knowledge#egg=django-knowledge
于 2018-12-31T00:59:11.500 回答
8

要仅从本地安装,您需要 2 个选项:

  • --find-links: 在哪里查找依赖项。不需要file://别人提到的前缀。
  • --no-index:不要在 pypi 索引中查找缺少的依赖项(依赖项未安装且不在--find-links路径中)。

因此,您可以从以下任何文件夹运行:

pip install --no-index --find-links /srv/pkg /path/to/mypackage-0.1.0.tar.gz

如果您的 mypackage 设置正确,它将列出其所有依赖项,并且如果您使用 pip download 下载级联依赖项(即依赖项的依赖项等),一切都会正常工作。

如果您想在可访问的情况下使用 pypi 索引,但如果不能访问则回退到本地车轮,您可以删除--no-index并添加--retries 0. 当它尝试检查 pypi 是否缺少依赖项(未安装的依赖项)时,您会看到 pip 暂停一段时间,当它发现无法访问它时,将回退到本地。似乎没有办法告诉 pip “先查找本地的,然后查找索引”。

于 2020-01-10T14:36:17.260 回答
7

在目录中有需求requirements.txtegg_dir作为目录

您可以构建本地缓存:

$ pip download -r requirements.txt -d eggs_dir

然后,使用该“缓存”很简单,例如:

$ pip install -r requirements.txt --find-links=eggs_dir

于 2018-11-05T19:48:23.193 回答
0

我一直在努力实现一些非常简单的事情,但惨遭失败,可能我很愚蠢。

无论如何,如果你有一个脚本/Dockerfile下载一个 python 包 zip 文件(例如从 GitHub),然后你想安装它,你可以使用file:///前缀来安装它,如下所示:

$ wget https://example.com/mypackage.zip
$ echo "${MYPACKAGE_MD5}  mypackage.zip" | md5sum --check -
$ pip install file:///.mypackage.zip

注意:我知道您可以使用直接安装软件包,但在我的情况下,我想验证校验和(从不偏执),并且在尝试使用 pip 提供的各种选项/片段pip install https://example.com/mypackage.zip时失败了。#md5

直接用pip. 我只是想通过校验和并在安装之前pip验证 zip 是否匹配。

我可能做了一些非常愚蠢的事情,但最后我放弃了,选择了这个。我希望它可以帮助其他尝试做类似事情的人。

于 2019-02-08T12:29:03.487 回答
0

就我而言,这是因为这个库依赖于另一个我尚未安装的本地库。使用 pip 安装依赖项,然后安装依赖库,解决了这个问题。

于 2021-03-09T20:31:18.563 回答
0

您需要的是--find-linkspip install。

-f, --find-links 如果是 html 文件的 url 或路径,则解析指向档案的链接。如果本地路径或 file:// url 是目录,则在目录列表中查找存档。

在我的情况下,在目录中生成python -m buildtar.gz 包(和whl文件)之后./dist

pip install --no-index -f ./dist YOUR_PACKAGE_NAME

里面的任何tar.gz python包./dist都可以通过这种方式安装。

但是如果你的包有依赖,这个命令会提示错误。要解决这个问题,您可以pip install从官方 pypi 源中获取这些部门,然后--no-deps像这样添加

pip install --no-index --no-deps -f ./dist YOUR_PACKAGE_NAME

或将您的 deps 包复制到 ./dist 目录。

于 2022-02-24T03:30:31.740 回答