{"id":477,"date":"2025-05-19T23:41:00","date_gmt":"2025-05-19T21:41:00","guid":{"rendered":"https:\/\/camilomatajira.wordpress.com\/?p=477"},"modified":"2025-09-29T18:40:35","modified_gmt":"2025-09-29T18:40:35","slug":"create-debian-package-out-of-a-python-installed-via-uv","status":"publish","type":"post","link":"https:\/\/camilo.matajira.com\/?p=477","title":{"rendered":"Create debian package out of a Python installed via UV"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Objective<\/h2>\n\n\n\n<p>Package a Python interpreter, that I will install via UV, in a debian package.<br>Specifically, I chose Python 3.9 (yes it&#8217;s old).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Alternative Review<\/h2>\n\n\n\n<p>To the best of my knowledge, it has not been done.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Solution<\/h2>\n\n\n\n<p>The Makefile below illustrates how to achieve it. You can also clone the project here: <a href=\"https:\/\/gitlab.com\/matajira\/debian-only-uv-python#\">https:\/\/gitlab.com\/matajira\/debian-only-uv-python#<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to run it?<\/h2>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>PREFIX = \/opt\/venvs\/debianuvpython\/\nSHELL = \/bin\/bash\n\ndefault: help\n\ninstall:\n    curl -LsSf https:\/\/astral.sh\/uv\/0.7.5\/install.sh | sh\n    source $$HOME\/.local\/bin\/env &amp;&amp; uv python install 3.9 &amp;&amp; uv python list\n    mkdir -p $(DESTDIR)$(PREFIX)\n\n    cp -R \/root\/.local\/share\/uv\/python\/cpython-3.9.22-linux-x86_64-gnu\/ $(DESTDIR)$(PREFIX)\n    patchelf &#8211;replace-needed &#8220;\\$$ORIGIN\/..\/lib\/libpython3.9.so.1.0&#8221; \\\n          &#8220;$(PREFIX)\/cpython-3.9.22-linux-x86_64-gnu\/lib\/libpython3.9.so.1.0&#8221; $(DESTDIR)$(PREFIX)\/cpython-3.9.22-linux-x86_64-gnu\/bin\/python3\n    patchelf &#8211;replace-needed &#8220;\\$$ORIGIN\/..\/lib\/libpython3.9.so.1.0&#8221; \\\n         &#8220;$(PREFIX)\/cpython-3.9.22-linux-x86_64-gnu\/lib\/libpython3.9.so.1.0&#8221; $(DESTDIR)$(PREFIX)\/cpython-3.9.22-linux-x86_64-gnu\/lib\/libpython3.so\n\nclean:\n    rm -rf .\/.venv\n\nDOCKER_RUN := docker run  -v$$PWD:\/home\/debian-only-uv-python-1.0.0 debian:bullseye\nbuild:\n    $(DOCKER_RUN) bash -c &#8220;apt-get update &amp;&amp; apt-get install -y devscripts debmake build-essential patchelf &amp;&amp; \\\n     cd \/home\/debian-only-uv-python-1.0.0 &amp;&amp; debmake -y &#8211;native; \n     cat debian\/rules | awk &#8216;\/override_dh_shlibdeps:\/ {exit 0} END {exit 1}&#8217; || \n     echo -e &#8216;override_dh_shlibdeps:\\n\\tdh_shlibdeps -Xcpython-3.9.22-linux-x86_64-gnu&#8217; >> debian\/rules; debuild &amp;&amp; cp ..\/*deb .\/&#8221;\n\nhelp:\n    echo &#8220;Debian loves uv&#8221;<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">PREFIX <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> \/opt\/venvs\/debianuvpython\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">SHELL <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> \/bin\/bash<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #8BE9FD\">default<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #F1FA8C\"> help<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #8BE9FD\">install<\/span><span style=\"color: #FF79C6\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #8BE9FD\">curl<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">-LsSf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">https<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #F1FA8C\">\/\/astral.sh\/uv\/0.7.5\/install.sh | sh<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    source <\/span><span style=\"color: #BD93F9; font-style: italic\">$$<\/span><span style=\"color: #F8F8F2\">HOME\/.local\/bin\/env &amp;&amp; uv python install 3.9 &amp;&amp; uv python list<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    mkdir -p <\/span><span style=\"color: #FF79C6\">$(<\/span><span style=\"color: #F8F8F2\">DESTDIR<\/span><span style=\"color: #FF79C6\">)$(<\/span><span style=\"color: #F8F8F2\">PREFIX<\/span><span style=\"color: #FF79C6\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    cp -R \/root\/.local\/share\/uv\/python\/cpython-3.9.22-linux-x86_64-gnu\/ <\/span><span style=\"color: #FF79C6\">$(<\/span><span style=\"color: #F8F8F2\">DESTDIR<\/span><span style=\"color: #FF79C6\">)$(<\/span><span style=\"color: #F8F8F2\">PREFIX<\/span><span style=\"color: #FF79C6\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    patchelf --replace-needed &quot;\\<\/span><span style=\"color: #BD93F9; font-style: italic\">$$<\/span><span style=\"color: #F8F8F2\">ORIGIN\/..\/lib\/libpython3.9.so.1.0&quot; \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          &quot;<\/span><span style=\"color: #FF79C6\">$(<\/span><span style=\"color: #F8F8F2\">PREFIX<\/span><span style=\"color: #FF79C6\">)<\/span><span style=\"color: #F8F8F2\">\/cpython-3.9.22-linux-x86_64-gnu\/lib\/libpython3.9.so.1.0&quot; <\/span><span style=\"color: #FF79C6\">$(<\/span><span style=\"color: #F8F8F2\">DESTDIR<\/span><span style=\"color: #FF79C6\">)$(<\/span><span style=\"color: #F8F8F2\">PREFIX<\/span><span style=\"color: #FF79C6\">)<\/span><span style=\"color: #F8F8F2\">\/cpython-3.9.22-linux-x86_64-gnu\/bin\/python3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    patchelf --replace-needed &quot;\\<\/span><span style=\"color: #BD93F9; font-style: italic\">$$<\/span><span style=\"color: #F8F8F2\">ORIGIN\/..\/lib\/libpython3.9.so.1.0&quot; \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">         &quot;<\/span><span style=\"color: #FF79C6\">$(<\/span><span style=\"color: #F8F8F2\">PREFIX<\/span><span style=\"color: #FF79C6\">)<\/span><span style=\"color: #F8F8F2\">\/cpython-3.9.22-linux-x86_64-gnu\/lib\/libpython3.9.so.1.0&quot; <\/span><span style=\"color: #FF79C6\">$(<\/span><span style=\"color: #F8F8F2\">DESTDIR<\/span><span style=\"color: #FF79C6\">)$(<\/span><span style=\"color: #F8F8F2\">PREFIX<\/span><span style=\"color: #FF79C6\">)<\/span><span style=\"color: #F8F8F2\">\/cpython-3.9.22-linux-x86_64-gnu\/lib\/libpython3.so<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #8BE9FD\">clean<\/span><span style=\"color: #FF79C6\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    rm -rf .\/.venv<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">DOCKER_RUN <\/span><span style=\"color: #FF79C6\">:=<\/span><span style=\"color: #F8F8F2\"> docker run  -v<\/span><span style=\"color: #BD93F9; font-style: italic\">$$<\/span><span style=\"color: #F8F8F2\">PWD:\/home\/debian-only-uv-python-1.0.0 debian:bullseye<\/span><\/span>\n<span class=\"line\"><span style=\"color: #8BE9FD\">build<\/span><span style=\"color: #FF79C6\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">$(<\/span><span style=\"color: #F8F8F2\">DOCKER_RUN<\/span><span style=\"color: #FF79C6\">)<\/span><span style=\"color: #F8F8F2\"> bash -c &quot;apt-get update &amp;&amp; apt-get install -y devscripts debmake build-essential patchelf &amp;&amp; \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">     cd \/home\/debian-only-uv-python-1.0.0 &amp;&amp; debmake -y --native; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">     <\/span><span style=\"color: #8BE9FD\">cat<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">debian\/rules<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">awk<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">&#39;\/override_dh_shlibdeps<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #F1FA8C\">\/ {exit 0} END {exit 1}&#39; || <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">     <\/span><span style=\"color: #8BE9FD\">echo<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">-e<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">&#39;override_dh_shlibdeps<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #F1FA8C\">\\n\\tdh_shlibdeps -Xcpython-3.9.22-linux-x86_64-gnu&#39; &gt;&gt; debian\/rules; debuild &amp;&amp; cp ..\/<\/span><span style=\"color: #BD93F9\">*<\/span><span style=\"color: #F1FA8C\">deb .\/&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #8BE9FD\">help<\/span><span style=\"color: #FF79C6\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    echo &quot;Debian loves uv&quot;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>make build<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">make<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">build<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">How it works?<\/h2>\n\n\n\n<p>Basically, when creating a debian package you can take several approaches.<br>In my case, I took advantage of dh_autoinstall.<br>dh_autoinstall will check if you have a Makefile, and if you have it, it will execute make install.<br>If you put the correct logic there (despite that it is a low-level approach) you can have the debian package.<\/p>\n\n\n\n<p>There are only two keys to make this work.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>You need to patch the python interpreter.<br>Remember, cpython as the name suggest is a C project. C projects are compiled, and sometimes during the compilation the binary is dynamically linked. This is the case of the Python that comes with debian, but it&#8217;s also de case of the python that you install via uv.<\/li>\n<\/ol>\n\n\n\n<p>This is how ldd looks like for python3 that is part of my ubuntu machine:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>ldd \/usr\/bin\/python3\nlinux-vdso.so.1 (0x00007ffef3f7e000)\nlibm.so.6 => \/lib\/x86_64-linux-gnu\/libm.so.6 (0x00007e79ce44e000)\nlibz.so.1 => \/lib\/x86_64-linux-gnu\/libz.so.1 (0x00007e79ce432000)\nlibexpat.so.1 => \/lib\/x86_64-linux-gnu\/libexpat.so.1 (0x00007e79ce406000)\nlibc.so.6 => \/lib\/x86_64-linux-gnu\/libc.so.6 (0x00007e79ce000000)\n\/lib64\/ld-linux-x86-64.so.2 (0x00007e79ce551000)<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">ldd<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\/usr\/bin\/python3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">linux-vdso.so.1<\/span><span style=\"color: #F8F8F2\"> (0x00007ffef3f7e000)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">libm.so.6<\/span><span style=\"color: #F8F8F2\"> =<\/span><span style=\"color: #FF79C6\">&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\/lib\/x86_64-linux-gnu\/libm.so.6<\/span><span style=\"color: #F8F8F2\"> (0x00007e79ce44e000)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">libz.so.1<\/span><span style=\"color: #F8F8F2\"> =<\/span><span style=\"color: #FF79C6\">&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\/lib\/x86_64-linux-gnu\/libz.so.1<\/span><span style=\"color: #F8F8F2\"> (0x00007e79ce432000)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">libexpat.so.1<\/span><span style=\"color: #F8F8F2\"> =<\/span><span style=\"color: #FF79C6\">&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\/lib\/x86_64-linux-gnu\/libexpat.so.1<\/span><span style=\"color: #F8F8F2\"> (0x00007e79ce406000)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">libc.so.6<\/span><span style=\"color: #F8F8F2\"> =<\/span><span style=\"color: #FF79C6\">&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\/lib\/x86_64-linux-gnu\/libc.so.6<\/span><span style=\"color: #F8F8F2\"> (0x00007e79ce000000)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">\/lib64\/ld-linux-x86-64.so.2<\/span><span style=\"color: #F8F8F2\"> (0x00007e79ce551000)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>This is how ldd looks like for python3.9 that I installed via uv:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>ldd \/home\/camilo\/.local\/share\/uv\/python\/cpython-3.9.20-linux-x86_64-gnu\/bin\/python3.9\nlinux-vdso.so.1 (0x00007fff2e5c9000)\n&lt;strong>&lt;em>\/home\/camilo\/.local\/share\/uv\/python\/cpython-3.9.20-linux-x86_64-gnu\/bin\/..\/lib\/libpython3.9.so.1.0 (0x00007f19a7200000)\n&lt;\/em>&lt;\/strong>libpthread.so.0 => \/lib\/x86_64-linux-gnu\/libpthread.so.0 (0x00007f19a71e3000)\nlibdl.so.2 => \/lib\/x86_64-linux-gnu\/libdl.so.2 (0x00007f19a71de000)\nlibutil.so.1 => \/lib\/x86_64-linux-gnu\/libutil.so.1 (0x00007f19a71d9000)\nlibm.so.6 => \/lib\/x86_64-linux-gnu\/libm.so.6 (0x00007f19a70f0000)\nlibrt.so.1 => \/lib\/x86_64-linux-gnu\/librt.so.1 (0x00007f19a70eb000)\nlibc.so.6 => \/lib\/x86_64-linux-gnu\/libc.so.6 (0x00007f19a6e00000)\n\/lib64\/ld-linux-x86-64.so.2 (0x00007f19a872b000)<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">ldd<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\/home\/camilo\/.local\/share\/uv\/python\/cpython-3.9.20-linux-x86_64-gnu\/bin\/python3.9<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">linux-vdso.so.1<\/span><span style=\"color: #F8F8F2\"> (0x00007fff2e5c9000)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">&lt;<\/span><span style=\"color: #F8F8F2\">strong&gt;&lt;em<\/span><span style=\"color: #FF79C6\">&gt;<\/span><span style=\"color: #F8F8F2\">\/home\/camilo\/.local\/share\/uv\/python\/cpython-3.9.20-linux-x86_64-gnu\/bin\/..\/lib\/libpython3.9.so.1.0 (<\/span><span style=\"color: #50FA7B\">0x00007f19a7200000<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">&lt;<\/span><span style=\"color: #F8F8F2\">\/em&gt;&lt;\/strong<\/span><span style=\"color: #FF79C6\">&gt;<\/span><span style=\"color: #F8F8F2\">libpthread.so.0 =<\/span><span style=\"color: #FF79C6\">&gt;<\/span><span style=\"color: #F8F8F2\"> \/lib\/x86_64-linux-gnu\/libpthread.so.0 (<\/span><span style=\"color: #50FA7B\">0x00007f19a71e3000<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">libdl.so.2<\/span><span style=\"color: #F8F8F2\"> =<\/span><span style=\"color: #FF79C6\">&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\/lib\/x86_64-linux-gnu\/libdl.so.2<\/span><span style=\"color: #F8F8F2\"> (0x00007f19a71de000)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">libutil.so.1<\/span><span style=\"color: #F8F8F2\"> =<\/span><span style=\"color: #FF79C6\">&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\/lib\/x86_64-linux-gnu\/libutil.so.1<\/span><span style=\"color: #F8F8F2\"> (0x00007f19a71d9000)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">libm.so.6<\/span><span style=\"color: #F8F8F2\"> =<\/span><span style=\"color: #FF79C6\">&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\/lib\/x86_64-linux-gnu\/libm.so.6<\/span><span style=\"color: #F8F8F2\"> (0x00007f19a70f0000)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">librt.so.1<\/span><span style=\"color: #F8F8F2\"> =<\/span><span style=\"color: #FF79C6\">&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\/lib\/x86_64-linux-gnu\/librt.so.1<\/span><span style=\"color: #F8F8F2\"> (0x00007f19a70eb000)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">libc.so.6<\/span><span style=\"color: #F8F8F2\"> =<\/span><span style=\"color: #FF79C6\">&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\/lib\/x86_64-linux-gnu\/libc.so.6<\/span><span style=\"color: #F8F8F2\"> (0x00007f19a6e00000)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">\/lib64\/ld-linux-x86-64.so.2<\/span><span style=\"color: #F8F8F2\"> (0x00007f19a872b000)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>As you can see, there are differences on the dynamic libraries used. But specially, the most interesting (and  problematic) is that in the python interpreter there is a hardcoded path to libpython3.9.so.1.0<\/p>\n\n\n\n<p>The hardcoding looks like this:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>patchelf &#8211;print-needed python3.0&lt;br>$ORIGIN\/..\/lib\/libpython3.9.so.1.0<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">patchelf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">--print-needed<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">python3.0<\/span><span style=\"color: #FF79C6\">&lt;<\/span><span style=\"color: #F1FA8C\">b<\/span><span style=\"color: #F8F8F2\">r<\/span><span style=\"color: #FF79C6\">&gt;<\/span><span style=\"color: #BD93F9\">$ORIGIN<\/span><span style=\"color: #F1FA8C\">\/..\/lib\/libpython3.9.so.1.0<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>And this is something that cannot be fixed by modifying LD_LIBRARY_PATH.<\/p>\n\n\n\n<p>So, to fix we will need to patch the executable and change the path libpython3.9.so.1.0 to a correct place. This is why you see this lines in the Makefile:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>patchelf &#8211;replace-needed &#8220;\\$$ORIGIN\/..\/lib\/libpython3.9.so.1.0&#8221; &#8220;$(PREFIX)\/cpython-3.9.22-linux-x86_64-gnu\/lib\/libpython3.9.so.1.0&#8221; $(DESTDIR)$(PREFIX)\/cpython-3.9.22-linux-x86_64-gnu\/bin\/python3\npatchelf &#8211;replace-needed &#8220;\\$$ORIGIN\/..\/lib\/libpython3.9.so.1.0&#8221; &#8220;$(PREFIX)\/cpython-3.9.22-linux-x86_64-gnu\/lib\/libpython3.9.so.1.0&#8221; $(DESTDIR)$(PREFIX)\/cpython-3.9.22-linux-x86_64-gnu\/lib\/libpython3.so<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">patchelf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">--replace-needed<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #FF79C6\">\\$<\/span><span style=\"color: #BD93F9\">$ORIGIN<\/span><span style=\"color: #F1FA8C\">\/..\/lib\/libpython3.9.so.1.0<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">$(<\/span><span style=\"color: #50FA7B\">PREFIX<\/span><span style=\"color: #F1FA8C\">)\/cpython-3.9.22-linux-x86_64-gnu\/lib\/libpython3.9.so.1.0<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">$(<\/span><span style=\"color: #50FA7B\">DESTDIR<\/span><span style=\"color: #F1FA8C\">)$(<\/span><span style=\"color: #50FA7B\">PREFIX<\/span><span style=\"color: #F1FA8C\">)\/cpython-3.9.22-linux-x86_64-gnu\/bin\/python3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">patchelf<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">--replace-needed<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #FF79C6\">\\$<\/span><span style=\"color: #BD93F9\">$ORIGIN<\/span><span style=\"color: #F1FA8C\">\/..\/lib\/libpython3.9.so.1.0<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">$(<\/span><span style=\"color: #50FA7B\">PREFIX<\/span><span style=\"color: #F1FA8C\">)\/cpython-3.9.22-linux-x86_64-gnu\/lib\/libpython3.9.so.1.0<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">$(<\/span><span style=\"color: #50FA7B\">DESTDIR<\/span><span style=\"color: #F1FA8C\">)$(<\/span><span style=\"color: #50FA7B\">PREFIX<\/span><span style=\"color: #F1FA8C\">)\/cpython-3.9.22-linux-x86_64-gnu\/lib\/libpython3.so<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>dh_shlibdeps is going to complain. Why? Because it will check that all the executables can find they&#8217;re corresponding dynamic libraries.<br>Despite that we &#8216;fix&#8217; the python executable, in the debian environment the fix does not have much sense because (I believe) of the change-root or fake-root during the build.<br>You will get an error similar to this:<br><code>dpkg-shlibdeps: error: cannot find library $ORIGIN\/..\/lib\/libpython3.9.so.1.0 needed by debian\/debianuvpython\/opt\/venvs\/debianuvpython\/bin\/python (ELF format: 'elf64-x86-64' abi: 'ELF:64:l:amd64:0'; RPATH: '')<\/code><\/li>\n<\/ol>\n\n\n\n<p>So the fix is to tell dh_shlibdeps to ignore this type of errors, once we are confident that our solution works, we can do it. We simply tell dh_shlibdeps to ignore problems for executables with this name cpython-3.9.22-linux-x86_64-gnu.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>dh_shlibdeps -Xcpython-3.9.22-linux-x86_64-gnu<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">dh_shlibdeps<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-Xcpython-3.9.22-linux-x86_64-gnu<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Final result:<\/h2>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>docker run -it -v$PWD:\/home &#8211;rm debian:bookworm \/bin\/bash\nroot@0c87b5d597a2:\/# cd home\nroot@0c87b5d597a2:\/home# dpkg -i debian-only-uv-python_1.0.0_amd64.deb\nSelecting previously unselected package debian-only-uv-python.\n(Reading database \u2026 7437 files and directories currently installed.)\nPreparing to unpack debian-only-uv-python_1.0.0_amd64.deb \u2026\nUnpacking debian-only-uv-python (1.0.0) \u2026\nSetting up debian-only-uv-python (1.0.0) \u2026\nProcessing triggers for libc-bin (2.36-9+deb12u10) \u2026\nroot@0c87b5d597a2:\/home# \/opt\/venvs\/debianuvpython\/cpython-3.9.22-linux-x86_64-gnu\/bin\/python &#8211;version\nPython 3.9.22<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">docker<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">run<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-it<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-v$PWD:\/home<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">--rm<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">debian:bookworm<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\/bin\/bash<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">root@0c87b5d597a2:\/#<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">cd<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">home<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">root@0c87b5d597a2:\/home#<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">dpkg<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-i<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">debian-only-uv-python_1.0.0_amd64.deb<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">Selecting<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">previously<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">unselected<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">package<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">debian-only-uv-python.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #50FA7B\">Reading<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">database<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\u2026<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">7437<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">files<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">and<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">directories<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">currently<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">installed.<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">Preparing<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">to<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">unpack<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">debian-only-uv-python_1.0.0_amd64.deb<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\u2026<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">Unpacking<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">debian-only-uv-python<\/span><span style=\"color: #F8F8F2\"> (1.0.0) \u2026<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">Setting<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">up<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">debian-only-uv-python<\/span><span style=\"color: #F8F8F2\"> (1.0.0) \u2026<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">Processing<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">triggers<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">for<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">libc-bin<\/span><span style=\"color: #F8F8F2\"> (2.36-9+deb12u10) \u2026<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">root@0c87b5d597a2:\/home#<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\/opt\/venvs\/debianuvpython\/cpython-3.9.22-linux-x86_64-gnu\/bin\/python<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">--version<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">Python<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">3.9<\/span><span style=\"color: #F1FA8C\">.22<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Objective Package a Python interpreter, that I will install via UV, in a debian package.Specifically, I chose Python 3.9 (yes it&#8217;s old). Alternative Review To the best of my knowledge, it has not been done. Solution The Makefile below illustrates how to achieve it. You can also clone the project here: https:\/\/gitlab.com\/matajira\/debian-only-uv-python# How to run&#8230;<\/p>\n","protected":false},"author":2,"featured_media":558,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[25,43,55],"class_list":["post-477","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-projects","tag-debian","tag-linux","tag-python"],"_links":{"self":[{"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/posts\/477","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=477"}],"version-history":[{"count":3,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/posts\/477\/revisions"}],"predecessor-version":[{"id":569,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/posts\/477\/revisions\/569"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/media\/558"}],"wp:attachment":[{"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}