是否可以使用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。


当前回答

你需要的是——找到pip install的链接。

-f,——find-links如果是html文件的url或路径,则解析到存档的链接。如果是本地路径或 file:// url,这是一个目录,然后在目录列表中查找存档。

在我的例子中,在python -m build之后,tar.gz包(和whl文件)在./dist目录下生成。

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

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

但是如果您的包有依赖项,这个命令将提示错误。 为了解决这个问题,你可以从官方的pypi源代码安装这些deps,然后像这样添加——no-deps

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

或者复制你的deps包到。/dist目录。

其他回答

我很确定你要找的是——找到链接选项。

你可以这样做

pip install mypackage --no-index --find-links file:///srv/pkg/mypackage

是什么::

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”。

要从本地安装,您需要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。您将看到pip在尝试检查pypi是否缺少依赖项(未安装的依赖项)时暂停一段时间,当它发现无法到达它时,将回落到本地。似乎没有办法告诉pip“先找本地的,再找索引”。

我一直在努力实现一些非常简单的事情,却不幸地失败了,可能是我太傻了。

不管怎样,如果你有一个脚本/Dockerfile下载了一个python包压缩文件(例如从GitHub),然后你想安装它,你可以使用文件:///前缀来安装它,如下例所示:

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

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

直接用pip来做这么简单的事情令人非常沮丧。我只是想传递一个校验和,并让pip在安装之前验证zip是否匹配。

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

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

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

.
└───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

一个整洁的方法来更新专有软件包,只需在文件夹中删除一个新的

通过这种方式,您可以从本地文件夹和pypi安装包,只需调用pip install -r requirements/production.txt即可

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