使用 pip 将 Python 包从本地文件系统文件夹安装到虚拟环境
- 2025-02-05 13:23:00
- admin 原创
- 92
问题描述:
是否可以使用 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
。
解决方案 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”的顶级目录。
解决方案 2:
我非常确定您正在寻找的东西就是--find-links
选项。
你可以做
pip install mypackage --no-index --find-links file:///srv/pkg/mypackage
解决方案 3:
从安装包页面,您可以简单地运行以下命令,其中/srv/pkg/mypackage是包含setup.py文件的目录。
pip install /srv/pkg/mypackage
另外1,您可以从存档文件中安装它。
pip install ./mypackage-1.0.4.tar.gz
1
虽然在问题中提到,但鉴于其受欢迎程度,因此也包括在内。
解决方案 4:
我正在安装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.
希望它能帮助你。
解决方案 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...
")
我从pip install 示例以及Rikard对另一个问题的回答中拼凑了这一点。“--pre”参数允许您安装非生产版本。“--no-index”参数避免搜索 PyPI 索引。“--find-links=.”参数在本地文件夹中搜索(可以是相对的或绝对的)。我使用“--log-file”、“log.txt”和“-vv”参数进行调试。“--upgrade”参数允许您在旧版本上安装较新的版本。
我还发现了一种卸载它们的好方法。当您有多个不同的 Python 环境时,这种方法很有用。它的基本格式相同,只是使用“uninstall”而不是“install”,并采取了安全措施来防止意外卸载:
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
解决方案 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 folder
AND安装软件包:pypi
`pip install -r requirements/production.txt`
PS. 参阅我的cookiecutter-djangopackage fork 来了解如何拆分需求并使用基于文件夹的需求组织。
解决方案 7:
要仅从本地安装,您需要 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 索引,但在无法访问时回退到本地 wheel,您可以删除--no-index
并添加--retries 0
。您会看到 pip 暂停一会儿,它会尝试检查 pypi 是否缺少依赖项(未安装的依赖项),当它发现无法访问时,将回退到本地。似乎没有办法告诉 pip“先查找本地的,然后再查找索引”。
解决方案 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
解决方案 9:
requirements.txt
在egg_dir
目录中有需求
您可以构建本地缓存:
$ pip download -r requirements.txt -d eggs_dir
然后,使用该“缓存”很简单,例如:
$ pip install -r requirements.txt --find-links=eggs_dir
解决方案 10:
您需要的是--find-links
pip install。
-f, --find-links 如果是 html 文件的 url 或路径,则解析存档的链接。如果是目录的本地路径或 file:// url,则在目录列表中查找存档。
就我而言,之后在目录中生成python -m build
tar.gz 包(和文件) 。whl
`./dist`
pip install --no-index -f ./dist YOUR_PACKAGE_NAME
任何 tar.gz python 包都./dist
可以通过这种方式安装。
但是如果你的包有依赖项,这个命令会提示错误。为了解决这个问题,你可以pip install
从官方 pypi 源中获取这些依赖项,然后--no-deps
像这样添加
pip install --no-index --no-deps -f ./dist YOUR_PACKAGE_NAME
或者将您的 deps 包复制到 ./dist 目录。
解决方案 11:
就我的情况而言,这是因为这个库依赖于另一个本地库,而我尚未安装该库。使用 pip 安装依赖项,然后安装依赖库,问题就解决了。
解决方案 12:
我一直在尝试实现一些非常简单的事情但却失败了,也许我很愚蠢。
无论如何,如果您有一个脚本/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 是否匹配。
我可能做了一件非常愚蠢的事情,但最终我放弃了,选择了这个。我希望它能帮助其他尝试做类似事情的人。
解决方案 13:
还有一个有用的标志:--no-build-isolation
。当我尝试从源代码安装而无需互联网时,它对我有帮助:
pip install -e . --disable-pip-version-check --no-index --find-links= ...
出现错误 - 未找到setuptools
,但是,setuptools 已安装,并--no-build-isolation
在此处提及:pip 说 setuptools 版本 40.8.0 不满足 setuptools>=40.8.0 的要求,解决了该问题。
解决方案 14:
只需在 pip 命令上添加目录pip install mypackage file:/location/in/disk/mypackagename.filetype
扫码咨询,免费领取项目管理大礼包!