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

是否可以使用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.

661857 次浏览

我很确定你要找的是所谓的--find-links选项。

你可以这样做

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

是什么::

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”。

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

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环境时,这很有用。它是相同的基本格式,只是使用“uninstall”而不是“install”,并有一个安全措施来防止意外卸载:

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、mypackagame -1.0.zip

我正在安装__abc0,但不是在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要求的版本(from versions:) 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.

希望能对你有所帮助。

选项——找到链接可以完成这项工作,它从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

一个整洁的方法来更新专有软件包,只需在文件夹中删除一个新的

通过这种方式,你可以通过同一个调用pip install -r requirements/production.txtlocal folderpypi安装包

附:请参阅我的cookiecutter-djangopackage分支,以了解如何分割需求和使用基于文件夹的需求组织。

requirements.txtegg_dir中有需求作为目录

您可以构建本地缓存:

$ pip download -r requirements.txt -d eggs_dir

然后,使用“缓存”很简单,就像:

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

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

我一直在努力实现一些非常简单的事情,却不幸地失败了,可能是我太傻了。

不管怎样,如果你有一个脚本/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 install /srv/pkg/mypackage

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


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

PIP install ./mypackage-1.0.4.tar.gz

<一口> 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。您将看到pip在尝试检查pypi是否缺少依赖项(未安装的依赖项)时暂停一段时间,当它发现无法到达它时,将回落到本地。似乎没有办法告诉pip“先找本地的,再找索引”。

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

你需要的是pip install的--find-links

-f,——find-links如果是html文件的url或路径,则解析到存档的链接。如果是本地路径或

. file:// url,这是一个目录,然后在目录列表中查找存档

在我的例子中,在python -m build之后,tar.gz包(和whl文件)在./dist目录中生成。

pip install --no-index -f ./dist YOUR_PACKAGE_NAME

./dist中的任何tar.gz python包都可以通过这种方式安装。

但是如果你的包有依赖关系,这个命令会提示错误。 要解决这个问题,你可以从官方pypi源代码pip install这些deps,然后像这样添加--no-deps

pip install --no-index --no-deps -f ./dist YOUR_PACKAGE_NAME

或者复制你的deps包到。/dist目录。

如果你想安装一个本地包(包A)来在另一个本地项目/包(B)中使用,这是相当简单的。你所需要的是CD到(B),并致电:

pip install /path/to/package(A)

当然,你需要先编译包(A):

sudo python3 ./setup.py install

并且,每次你改变包A时,只需在包(A)中再次运行setup.py,然后在使用项目/包(B)中的pip install ...

在pip命令上添加目录 pip install mypackage file:/location/in/disk/mypackagename.filetype < / p >