【问题标题】:Installing Python packages from local file system folder to virtualenv with pip使用 pip 将 Python 包从本地文件系统文件夹安装到 virtualenv
【发布时间】:2013-02-08 12:20:47
【问题描述】:

是否可以使用本地文件系统中的 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 搜索的另一个地方。

【问题讨论】:

标签: python pip


【解决方案1】:

怎么样::

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

【讨论】:

  • 这将在开发模式下安装包,这意味着它只会链接回源所在的位置。如果有任何机会移动或删除源,导入包将失败。
  • @MarcoDinacci --editable 的有趣之处在于它似乎查看了本地包的目录并将源设置为 git repo(如果有的话)——比文件夹更灵活一点。我找不到这方面的文档。
  • 虽然这对于安装特定软件包是正确的,尤其是在本地机器或 VCS url 上的当前/密集开发中的软件包。它没有回答关于在父目录中搜索所有本地包源而不是一个特定的包源的问题。当您有一个目录或 url 包含多个要从中进行 pip 安装的包时,接受的答案有效。
  • @Simon 有没有办法告诉 pip 不要寻找 git repo?如果我 do pip install -e 它从 git 远程检查代码,我想按原样安装代码(远程尚未更改)。
  • 如果有帮助,我做了一个简单的工作示例:github.com/MareoRaft/…
【解决方案2】:

我很确定您要查找的内容称为 --find-links 选项。

你可以的

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

【讨论】:

  • pip install mypackage --no-index --find-links file:///srv/pkg/mypackage 应该可以工作。
  • 它确实有帮助。我们可以使用 pip 的 -i 选项将其视为本地 PyPI。
  • 等价的easy_install命令是easy_install --allow-hosts=None --find-links file:///srv/pkg/mypackage mypackage
  • 请注意--find-links 仍然允许在指定位置找不到包或更新版本可用时在 PyPI 上进行搜索。在 Windows 上,我发现将其与 --only-binary=packagename(或 --only-binary=:all:)结合使用非常有用。这可以防止 pip 尝试下载任何具有本地依赖项的包,这些包仅在 PyPI 上具有源分发(因此需要编译),这是我必须尝试从目录安装的最常见原因。与--no-index 不同,我仍然可以从 PyPI 安装 other 包。
【解决方案3】:

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

希望对你有帮助。

【讨论】:

  • 这对我有用。我尝试了其他方法并被Could not find a version that satisfies 错误绊倒。谢谢。
【解决方案4】:

installing-packages page 你可以简单地运行:

pip install /srv/pkg/mypackage

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


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

pip install ./mypackage-1.0.4.tar.gz

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

【讨论】:

  • 这应该是默认答案。如果您确切知道您的包在本地计算机上的位置,则无需使用 --find-links 进行 pip 搜索。
【解决方案5】:

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

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 answeranother 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

【讨论】:

  • 谢谢。 “--find-links=.”和“--no-index”,在我的实用程序包中将python脚本粘合在一起的关键,它首先从站点包中删除旧版本包,然后从子目录中安装一个tar.gz'ed包实用程序包文件夹(不知道 --find-links=.),然后创建轮子并安装它。所有通过铅锤和点击自动化。如果有人想要,我会发布一个链接。赞成。
【解决方案6】:

一个选项--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 folderpypi 安装软件包:pip install -r requirements/production.txt

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

【讨论】:

  • 谢谢,这比我想的还要好!
【解决方案7】:

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

【讨论】:

    【解决方案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 “先查找本地的,然后查找索引”。

    【讨论】:

      【解决方案9】:

      requirements.txtegg_dir 中有要求作为目录

      您可以构建本地缓存:

      $ pip download -r requirements.txt -d eggs_dir

      那么,使用那个“缓存”很简单:

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

      【讨论】:

      • 谢谢,-r 是我缺少的部分,因为文档似乎没有表明这是必需的。我希望它只安装 --find-links 中的所有内容,但您还需要以某种方式告诉它要从该目录安装什么。干杯!
      【解决方案10】:

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

      无论如何,如果你有一个脚本/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 是否匹配

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

      【讨论】:

        【解决方案11】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-30
          • 2011-10-31
          • 2011-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多