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

时间:2013-02-22 19:21:34

标签: python pip

是否可以使用本地文件系统中的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 install mypackage位置作为点击搜索的另一个位置。

12 个答案:

答案 0 :(得分:379)

怎么样::

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'的顶级目录。

答案 1 :(得分:109)

我很确定您要找的是--find-links选项。

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

https://github.com/wolever/pip2pi

答案 2 :(得分:28)

我正在安装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.

希望它可以帮到你。

答案 3 :(得分:21)

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

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上的another question将其拼凑在一起。 &#34; - pre&#34;参数允许您安装非生产版本。 &#34; - 无索引&#34;参数避免了搜索PyPI索引。 &#34; - find-links =。&#34;参数在本地文件夹中搜索(这可以是相对的或绝对的)。我使用&#34; - 日志文件&#34;,&#34; log.txt&#34;和&#34; -vv&#34;调试参数。 &#34; - 升级&#34;参数允许您安装较旧的版本。

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

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

答案 4 :(得分:10)

选项--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 put:

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

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

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

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

答案 5 :(得分:6)

要仅从本地安装,您需要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“先查找本地索引,然后查找索引”。

答案 6 :(得分:3)

requirements.txtegg_dir作为目录具有要求

您可以构建本地缓存:

$ pip download -r requirements.txt -d eggs_dir

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

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

答案 7 :(得分:3)

installing-packages page中,您可以简单地运行:

  

pip install / srv / pkg / mypackage

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


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

  

pip install ./mypackage-1.0.4.tar.gz

1 尽管已在问题中指出,但由于其受欢迎程度,它也包括在内。

答案 8 :(得分:1)

假设您有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

答案 9 :(得分:0)

我一直在努力实现一些简单而又失败的尝试,也许我很愚蠢。

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

$ 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是否与安装之前匹配。

我可能做的很愚蠢,但最终我放弃了,选择了。我希望它可以帮助其他尝试做类似事情的人。

答案 10 :(得分:0)

pip install packages/*

像魅力一样工作。

所有需要的软件包都位于以下文件夹中:

pip download $(pip freeze)

答案 11 :(得分:0)

就我而言,这是因为该库依赖于我尚未安装的另一个本地库。先用pip安装依赖,再安装依赖库,问题解决。