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

cha*_*dgh 308 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.

drp*_*poo 423

关于什么::

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.
Run Code Online (Sandbox Code Playgroud)

例如, pip install -e /srv/pkg

其中/ srv/pkg是可以找到'setup.py'的顶级目录.

  • 这将以开发模式安装软件包,这意味着它将链接回源所在的位置.如果移动或删除了源,则导入包将失败. (45认同)
  • 如果有帮助的话,我做了一个简单的工作示例:https://github.com/MareoRaft/local-development-of-python-package-and-dep (4认同)
  • @MarcoDinacci有关`--editable`的有趣之处在于它似乎调查了本地软件包的目录并将源代码设置为git repo(如果有的话) - 比文件夹更灵活一点.我找不到这方面的文档. (3认同)
  • 虽然这对于安装特定软件包是正确的,特别是在本地计算机或VCS URL上的当前/密集开发中.它没有回答有关在父目录中搜索所有本地包源_的问题,而不是一个特定的包源_.如果您的目录或网址包含要从中进行pip安装的多个程序包,则接受的答案将起作用. (3认同)
  • @Simon 有没有办法告诉 pip 不要寻找 git 存储库?如果我 `do pip install -e` 它会从 git 远程检查代码,我想按原样安装代码(远程尚未进行更改)。 (3认同)
  • @PiotrDobrogost:如果你的意思是不好的做法,我同意.但是怎么回事呢? (2认同)

Mik*_*maa 120

我很确定你要找的东西叫做--find-links选项.

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

https://github.com/wolever/pip2pi

  • `pip install mypackage --no-index --find-links file:/// srv/pkg/mypackage`应该可以工作. (85认同)
  • https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/#installing-from-local-archives (4认同)
  • 请注意,如果在指定位置找不到包或有更新的版本可用,`--find-links` 仍将允许在 PyPI 上进行搜索。在 Windows 上,我发现将其与`--only-binary=packagename`(或`--only-binary=:all:`)结合使用*非常*有用。这可以防止 pip 尝试下载任何仅在 PyPI 上具有源发行版(因此需要编译)的具有本机依赖项的包,这是我必须尝试从目录安装的最常见原因。与 `--no-index` 不同,我仍然可以从 PyPI 安装 *other* 包。 (3认同)
  • 它确实有帮助。我们可以使用 pip 的 *-i* 选项将其视为本地 PyPI。 (2认同)

dim*_*im8 43

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

pip 安装 /srv/pkg/mypackage

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


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

pip install ./mypackage-1.0.4.tar.gz

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

  • 这应该是默认答案。如果您确切知道软件包在本地计算机上的位置,则无需使用 --find-links 进行 pip 搜索。 (6认同)
  • 这是最简单的解决方案!我可以补充一点,添加默认位置之外的另一个位置也可以: pip install./mypackage-1.0.4.tgz --prefix C:\OtherLocation (4认同)

Vic*_*hoy 33

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

我尝试了接受的答案

pip install  --no-index --find-links=file:///Users/victor/Downloads/pyfuzzy-0.1.0 pyfuzzy
Run Code Online (Sandbox Code Playgroud)

但它也不起作用并返回以下错误:

忽略索引: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
Run Code Online (Sandbox Code Playgroud)

所以以下命令对我有用:

pip install ../pyfuzzy-0.1.0.tar.gz.
Run Code Online (Sandbox Code Playgroud)

希望它可以帮到你.

  • 这对我有用。我尝试了其他方法,但被“找不到满足错误的版本”迷住了。谢谢。 (2认同)

Dev*_*ams 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")
Run Code Online (Sandbox Code Playgroud)

我从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")
Run Code Online (Sandbox Code Playgroud)

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

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

Jan*_*zny 12

一个选项--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
Run Code Online (Sandbox Code Playgroud)

现在requirements/base.txt放在:

--find-links=requirements
foo_bar
wiz_bang>=0.8
Run Code Online (Sandbox Code Playgroud)

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

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

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


mar*_*cus 8

假设你有 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
Run Code Online (Sandbox Code Playgroud)


Oli*_*ver 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
Run Code Online (Sandbox Code Playgroud)

如果您的 mypackage 设置正确,它将列出其所有依赖项,如果您使用 pip download 来下载依赖项级联(即依赖项的依赖项等),则一切都会正常。

如果您想在可访问的情况下使用 pypi 索引,但如果不可访问则回退到本地轮子,您可以删除--no-index并添加--retries 0. 当它尝试检查 pypi 是否缺少依赖项(未安装)时,您会看到 pip 暂停一会儿,当它发现无法访问它时,将回退到本地。似乎没有办法告诉 pip “首先查找本地的,然后是索引”。

  • 感谢您添加 --find-links 和 --no-index 解释。 (2认同)

Sła*_*art 7

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

您可以构建本地缓存:

$ pip download -r requirements.txt -d eggs_dir

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

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