Say you are developing Blender add-ons and you need some additional packages, perhaps to to some line profiling use the line_profiler package.
You could keep a separate Python installation outside your Blender environment (like I mentioned in this old article ) but then versions needed to be the same and you needed to tweak the import path to be able use those packages.
An easier approach is to install the necessary packages in your actual Blender Python installation, but if you use pip
from the command line it will install inside you regular python environment because pip
is a python script that installs in whatever Python installation it is part of.
Fortunately it is rather straight forward to bootstrap your Blender Python environment to get its own pip
and then use it to install whatever you want.
Examples
In the examples below, /blender refers to your Blender installation directory. This could be something like /home/michel/Downloads/blender-2.93.0-stable+blender-v293-release.84da05a8b806-linux.x86_64-release
First we install the pip module
/blender/2.93/python/bin/python3.9 -m ensurepipAfter installing it, we verify whether it works
/blender/2.93/python/bin/python3.9 -m pip --version pip 20.2.3 from /blender/2.93/python/lib/python3.9/site-packages/pip (python 3.9)Now we can immediately use it to install packages inside the Blender Python installation, for example the
line_profiler
package
/blender/2.93/python/bin/python3.9 -m pip install line_profiler Collecting line_profiler ... [a boatload of dependencies gets downloaded as well] ...You will most likely get a warning
WARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.which is ok. You can upgrade the pip module if you like (with
/blender/2.93/python/bin/python3.9 -m pip install --upgrade pip
) but the version you got with ensurepip
works fine, as demonstrated, so there is no immediate need. You can verify that the package is installed
ls /blender/2.93/python/lib/python3.9/site-packages/line_profilerNow you can use this package in your add-ons without the need to change
sys.path
from line_profiler import LineProfiler profile = LineProfiler() @profile def fie(): ... expensive code happening here ...And then somewhere else in your code
profile.dump_stats("/tmp/test.prof")Inspecting the profile can then be done with
/blender/2.93/python/bin/python3.9 -m line_profiler /tmp/test.prof
Notes
You cannot profile Python code that you code inside text blocks in Blender. Or rather you can profile them alright but you can not inspect the stats in any meaningful way because the file name of the code that is logged makes no sense (if your .blend is called MyBlend
and you have a text block test.py
, the file will be called .../MyBlend.blend/test.py
which is a file that does not exist and even if you save your text block this is an issue because MyBlend.blend
is not a directory you can save to. I do not have a workaround for this (except for hacking the .prof file) but in practice this is probably not much of an issue.
Do not forget to remove the profiling changes (and the import) if you want to distribute your add-on, because your customer will probably not have the line_profiler package installed.
(refer to the original article for a bit more detail. Note that there is no longer the need to use my tweaked version, if you use pip as described earlier you have all you need)
No comments:
Post a Comment