Page MenuHome

No longer able to install pip on 2.81
Closed, ResolvedPublic

Description

System Information
Operating system: Windows 10
Graphics card: Nvidia GTX 960

Blender Version
Broken: 2.81
Worked: 2.80

Short description of error

Can't install pip anymore?

Exact steps for others to reproduce the error

In windows terminal jump into folder:
F:\Blender\blender-2.81-windows64\2.81\python\bin
and run: python.exe -m ensurepip

Results in:

F:\Blender\blender-2.81-windows64\2.81\python\bin>python.exe -m ensurepip
F:\Blender\blender-2.81-windows64\2.81\python\bin\python.exe: No module named ensurepip

On previous versions this worked fine:

F:\Blender\test\blender-2.80-windows64\2.80\python\bin>python.exe -m ensurepip
Looking in links: C:\Users\rosso\AppData\Local\Temp\tmp0w48guuq
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-10.0.1 setuptools-39.0.1

This is required to install a very good GIS addon BlenderGIS which has instructions for installing GDAL and Numpy here:
https://github.com/domlysz/BlenderGIS/wiki/How-to-install-GDAL

But it requires pip is installed first.

Related Objects

Event Timeline

Robert Guetzkow (rjg) changed the task status from Unknown Status to Resolved.EditedNov 24 2019, 1:58 PM
Robert Guetzkow (rjg) claimed this task.

Blender 2.81 ships with pip installed. There is no need to use ensurepip anymore.

K:\05_Download\blender-2.81-windows64\2.81\python\bin>.\python.exe -m pip --version
pip 19.0.3 from K:\05_Download\blender-2.81-windows64\2.81\python\lib\site-packages\pip (python 3.7)

I'm closing this ticket since the issue has been resolved.

@Robert Guetzkow (rjg) What is the new correct way of installing a package through pip from within Blender 2.81+, using Python code?

The use-case: A add-on button triggering pip install for a library that's necessary in the add-on.

Previously I was doing this: https://blender.stackexchange.com/questions/139718/install-pip-and-packages-from-within-blender-os-independently
So removing the ensurepip part let me to the following code:

import subprocess
subprocess.call(["pip", "install", "pyzmq"])

Which returns 0, so at first I thought things were fine... but import pyzmq does not work.
Looking in the terminal I see Requirement already satisfied: pyzmq in /home/*user*/anaconda3/lib/python3.6/site-packages (17.1.2).
Therefore, it seems like this method does not work if you have some other Python installed on your system?

How do I pip install pyzmq in Blender's Python from within Python code (using it in my add-on)?

Using the help over at https://blender.chat/channel/python I got it to work with:

import subprocess
pybin = bpy.app.binary_path_python
subprocess.check_call([pybin, '-m', 'pip', 'install', 'your_package'])

My above suggestion is actually wrong. I enabled pip by copying Blender 2.80's ensurepip. In a fresh install, trying the above instead gives:

No module named pip

Even though executing ./python3.7m -m pip --version works (on Ubuntu 16.04) in the folder where python3.7m can be found.

~/Downloads/blender-2.81a-linux-glibc217-x86_64_zmq/2.81/python/bin$ ./python3.7m -m pip --version
pip 20.0.2 from /home/user/Downloads/blender-2.81a-linux-glibc217-x86_64_zmq/2.81/python/lib/python3.7/site-packages/pip (python 3.7)

You can test this by yourself when running the following commands in the Blender terminal:

>>> import pip
Traceback (most recent call last):
  File "<blender_console>", line 1, in <module>
ModuleNotFoundError: No module named 'pip'

>>> import subprocess
>>> pybin = bpy.app.binary_path_python
>>> subprocess.check_call([pybin, '-m', 'pip', 'install', 'pyzmq'])
Traceback (most recent call last):
  File "<blender_console>", line 1, in <module>
  File "/home/user/Downloads/blender-2.81a-linux-glibc217-x86_64/2.81/python/lib/python3.7/subprocess.py", line 347, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/home/user/Downloads/blender-2.81a-linux-glibc217-x86_64/2.81/python/bin/python3.7m', '-m', 'pip', 'install', 'your_package']' returned non-zero exit status 1.

@Robert Guetzkow (rjg) Any idea how to use pip from Blender's terminal / a python script?

Running the following seems to work at first:

import ensurepip
ensurepip.bootstrap()

However, when trying to install a package, I get an EnvironmentError (with and without sudo):

>>> subprocess.call([pybin, "-m", "pip", "install", "pyzmq"])
Collecting pip
  Downloading https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-py2.py3-none-any.whl (1.4MB)
    100% |████████████████████████████████| 1.4MB 5.1MB/s 
Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory: '/tmp/pip-req-tracker-izir93td/7bbe47980f49b7305d8ea0c017d6469e99eb42e5755ab9b3e555fab8'

@Iemand Iets (NumesSanguis) You must have broken something in your previous attempts to get pip working. On a clean install of Blender you can properly install packages through subprocess, I've tested this for pyzmq. In order to see what went wrong with your install you might want to use subprocess.check_output().

import bpy
import subprocess

try:
    output = subprocess.check_output([bpy.app.binary_path_python, '-m', 'pip', 'install', 'pyzmq'])
    print(output)
except subprocess.CalledProcessError as e:
    print(e.output)

It is very strange for me, but somehow this order worked (tried a few times with different clean Blender):

import bpy
import subprocess

# need to do this once, otherwise `No module named pip` error
import ensurepip
ensurepip.bootstrap()

try:
    output = subprocess.check_output([bpy.app.binary_path_python, '-m', 'pip', 'install', 'pyzmq'])
    print(output)
except subprocess.CalledProcessError as e:
    print(e.output)

I need to run ensurepip.bootstrap() once, otherwise the subprocess call will give the error: No module named pip.

However, the above will fail with the No such file or directory error described in my previous post.

If I restart Blender, and now run the code block above, except with the ensurepip.bootstrap() removed, it works?

Seems that the ensurepip.bootstrap() somehow change the folder where pip will store the temporary downloaded file, but there is no permission to create that file? Although running Blender with sudo gives the same result?

So my final script, which works, but has to be run twice and a Blender restart in the middle:

try:
    # will fail the first time, but works after `ensurepip.bootstrap()` has been called once
    print("Importing pip...")
    import pip
except ModuleNotFoundError as e:
    # only first attempt will reach here
    print("Pip import failed with: ", e)
    import ensurepip
    ensurepip.bootstrap()

try:
    print("Trying pyzmq install")
    output = subprocess.check_output([bpy.app.binary_path_python, '-m', 'pip', 'install', 'pyzmq'])
    print(output)
except subprocess.CalledProcessError as e:
    print(e.output)

You can find the full code here (for Blender 2.80 & 2.81+): https://github.com/NumesSanguis/Blender-ZMQ-add-on/blob/v1.1/blendzmq_ops.py#L139-L220

@Iemand Iets (NumesSanguis) I can reproduce this issue. ensurepip.bootstrap() breaks subsequent calls to pip install in subprocess because the temporary directory cannot be found. Unfortunately I was wrong about ensurepip, it is still needed on Linux since pip is only included with the Windows releases.

The cause of the issue is that ensurepip.bootstrap() modifies os.environ because it's also calling pip. It sets the environment variable PIP_REQ_TRACKER. Removing PIP_REQ_TRACKER from os.environ before installing packages through subprocess solves the issue.

ensurepip.bootstrap()
os.environ.pop("PIP_REQ_TRACKER", None)