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


345

是否可以使用本地文件系统中的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


我当时想从WHL wheel安装不带setup.py的PyPi软件包,并且在为我的Python版本下载了正确的版本并运行之后就安装了它pip install <Path-to-WHL-file>
WiktorStribiżew16年

Answers:


136

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

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

https://github.com/wolever/pip2pi


100
pip install mypackage --no-index --find-links file:///srv/pkg/mypackage应该管用。
jfs

1
确实有帮助。我们可以使用pip的-i选项将其视为本地PyPI。
diabloneo

等效的easy_install命令为easy_install --allow-hosts=None --find-links file:///srv/pkg/mypackage mypackage
Wilfred Hughes,

我必须创建一个源分发文件,而不仅仅是将其指向项目或软件包目录,然后再运行。这让我绊倒了。docs.python.org/3.6/distutils/sourcedist.html
乔什(Josh)

3
请注意,--find-links如果在指定位置找不到软件包或有较新的版本,仍将允许在PyPI上进行搜索。在Windows上,我发现将其与--only-binary=packagename(或--only-binary=:all:)结合使用非常有用。这可以防止pip尝试下载仅具有PyPI上源分发的具有本地依赖性的任何程序包(因此需要编译),这是我不得不尝试从目录安装的最常见原因。与不同--no-index,我仍然可以从PyPI 安装其他软件包。
jpmc26

463

关于什么::

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


49
这将以开发模式安装该软件包,这意味着它将仅链接回到源所在的位置。如果源被移动或删除,导入包将失败。
Trasplazio Garzuglio 2015年

3
@MarcoDinacci有趣的--editable是,它看起来似乎在本地包的目录中,并且如果有的话,将源设置为git repo-比文件夹更灵活。我找不到有关此的文档。
2015年

3
尽管这对于安装特定的软件包是正确的,尤其是在本地计算机或VCS url上当前/大量开发中的软件包。它没有回答有关在父目录中搜索所有本地软件包源而不是一个特定软件包源的问题。当您的目录或URL包含要从中进行pip安装的多个软件包时,可接受的答案有效。
加文

@MarcoDinacci但是,假设用户下载了代码。如果他们有那么聪明,他们就把它放在想要的程序所在的地方。他们为什么要移动它?
Zelphir Kaltstahl,

1
@Simon有没有办法告诉pip不要寻找git repo?如果我do pip install -e从git远程签出代码,我想按原样安装代码(远程中尚未进行更改)。
Pedru '18年

39

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

希望它能对您有所帮助。


4
这对我有用。我尝试了其他方法,但被Could not find a version that satisfies错误绊倒了。谢谢。
拉尔

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安装示例以及Rikard另一个问题的回答中总结了这一点。“ --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


1
谢谢。“ --find-links =”。和“ --no-index”,其中将实用程序包中的python-script粘合在一起的关键是先从站点包中删除old-version-package,然后从子目录中安装tar.gz'ed包(不知道--find-links =。)的工具包文件夹,然后创建轮子并安装它。所有操作均通过铅锤自动完成,然后单击。如果有人愿意,我会发布一个链接。已投票。
JackLeEmmerdeur'8

15

一个--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分支,以了解如何拆分需求并使用基于文件夹的需求组织。


谢谢,这比我想的要好!
FoundNil

11

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

点安装/ srv / pkg / mypackage

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


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

点安装./mypackage-1.0.4.tar.gz

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


2
这应该是默认答案。如果您确切知道您的软件包在本地计算机上的位置,则无需使用--find-links进行点子搜寻。
罗伯特

6

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

5

其要求requirements.txt,并egg_dir作为目录

您可以构建本地缓存:

$ pip download -r requirements.txt -d eggs_dir

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

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


1

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


-1

我一直在尝试实现一些非常简单且失败的尝试,也许我很愚蠢。

无论如何,如果您有一个script / Dockerfile可以下载python软件包zip文件(例如从GitHub),然后要安装它,则可以使用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匹配。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.