是否可以使用本地文件系统中的 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
。这会起作用,但我说的是如果我键入 pip install mypackage
,则使用 /srv/pkg
位置作为 pip 搜索的另一个位置。
pip install <Path-to-WHL-file>
后安装的。
关于什么::
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”的顶级目录。
我很确定您要查找的内容称为 --find-links
选项。
你可以做
pip install mypackage --no-index --find-links file:///srv/pkg/mypackage
pip install mypackage --no-index --find-links file:///srv/pkg/mypackage
应该可以工作。
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 包。
从 installing-packages page 您可以简单地运行:
pip install /srv/pkg/mypackage
其中 /srv/pkg/mypackage 是包含 setup.py 的目录。
此外1,您可以从存档文件安装它:
pip install ./mypackage-1.0.4.tar.gz
1 虽然在问题中注明,但由于其受欢迎程度,也包括在内。
我正在安装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
错误绊倒。谢谢。
这是我最终使用的解决方案:
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 拼凑了这个。 “--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 完成这项工作,它从 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
和 pypi
安装软件包:pip install -r requirements/production.txt
PS。请参阅我的 cookiecutter-djangopackage fork,了解如何拆分需求和使用基于文件夹的需求组织。
假设您有 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
在 requirements.txt
和 egg_dir
中有要求作为目录
您可以构建本地缓存:
$ pip download -r requirements.txt -d eggs_dir
然后,使用该“缓存”很简单,例如:
$ pip install -r requirements.txt --find-links=eggs_dir
要仅从本地安装,您需要 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 “先查找本地的,然后查找索引”。
您需要的是 pip install 的 --find-links
。
-f, --find-links 如果是 html 文件的 url 或路径,则解析指向档案的链接。如果本地路径或 file:// url 是目录,则在目录列表中查找存档。
在我的例子中,在 python -m build
之后,在 ./dist
目录中生成了 tar.gz 包(和 whl
文件)。
pip install --no-index -f ./dist YOUR_PACKAGE_NAME
./dist
中的任何 tar.gz python 包都可以通过这种方式安装。
但是如果你的包有依赖,这个命令会提示错误。要解决此问题,您可以pip install
来自官方 pypi 源的那些部门,然后像这样添加 --no-deps
pip install --no-index --no-deps -f ./dist YOUR_PACKAGE_NAME
或将您的 deps 包复制到 ./dist 目录。
我一直在努力实现一些非常简单的事情,但惨遭失败,可能我很愚蠢。
无论如何,如果您有一个脚本/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 是否匹配。。
我可能做了一些非常愚蠢的事情,但最后我放弃了,选择了这个。我希望它可以帮助其他尝试做类似事情的人。
就我而言,这是因为该库依赖于另一个我尚未安装的本地库。使用 pip 安装依赖项,然后安装依赖库,解决了这个问题。
如果您想安装一个本地包(包 A)以在另一个本地项目/包(B)中使用,这非常简单。您只需要 CD 到 (B) 并致电:
pip install /path/to/package(A)
当然,您需要先编译包(A):
sudo python3 ./setup.py install
而且,每次更改包 A 时,只需在包 (A) 中再次运行 setup.py
,然后在使用项目/包 (B) 中运行 pip install ...
不定期副业成功案例分享
--editable
的有趣之处在于它似乎查看了本地包的目录并将源设置为 git repo(如果有的话) - 比文件夹更灵活一点。我找不到这方面的文档。do pip install -e
它从 git 远程检查代码,我想按原样安装代码(远程尚未更改)。