使用pip将Python软件包从本地文件系统文件夹安装到virtualenv

Installing Python packages from local file system folder to virtualenv with pip

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

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

现在,在虚拟环境中,我希望安装来自PYPI或特定本地位置/srv/pkg的包。

这有可能吗?

聚苯乙烯我知道我可以指定pip install /srv/pkg/mypackage/mypackage-0.1.0.tar.gz。这是可行的,但我正在讨论如果我键入pip install mypackage,使用/srv/pkg位置作为pip搜索的另一个位置。


如何:

1
2
3
4
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'的顶级目录。


我很确定你要找的是一种叫--find-links的选择。

尽管您可能需要为本地包索引生成一个虚拟的index.html,其中列出了到所有包的链接。此工具有助于:

https://github.com/woover/pip2pi


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

我试过了公认的答案

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

但它也不工作,并返回以下错误:

Ignoring indexes: https://pypi.python.org/simple
Collecting pyfuzzy
Could not find a version that satisfies the requirement pyfuzzy (from versions: )
No matching distribution found for pyfuzzy

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

1
2
3
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

所以下面的命令对我有效:

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

希望它能帮助你。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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...
"
)

我从PIP安装示例以及Rikard对另一个问题的回答中拼凑出这一点。"-pre"参数允许您安装非生产版本。"-no index"参数避免搜索pypi索引。"-find links="参数在本地文件夹中搜索(可以是相对的或绝对的)。我使用了"-log file"、"log.txt"和"-vv"参数进行调试。"-upgrade"参数允许您在旧版本上安装新版本。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pip


def uninstall(package):
    response = raw_input("Uninstall '%s'? [y/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...
"
)

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


一个选项——find links完成任务,它从requirements.txt文件工作!

您可以将包档案放在某个文件夹中,取最新的一个,而不必更改需求文件,例如requirements

1
2
3
4
5
6
7
8
9
10
.
└───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中,输入:

1
2
3
--find-links=requirements
foo_bar
wiz_bang>=0.8

一种更新专有软件包的简单方法,只需将新软件包放到文件夹中即可。

通过这种方式,您可以安装来自local folderpypi的包,使用同一个调用:pip install -r requirements/production.txt

请参阅我的CookieCutter Djangopackage Fork,了解如何分割需求并使用基于文件夹的需求组织。


要求在requirements.txtegg_dir中作为目录

您可以构建本地缓存:

$ pip download -r requirements.txt -d eggs_dir

然后,使用这个"缓存"很简单,比如:

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


假设您有virtualenv和一个requirements.txt文件,那么您可以在该文件中定义从何处获取包:

1
2
3
4
5
6
7
# 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

我一直在尝试做一些简单的事情,但失败得很惨,可能我很愚蠢。

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

1
2
3
$ 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是否匹配。

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