46

I installed embedded python from here, titled "Windows x86-64 embeddable zip file", but it does not have pip installed, it does not have site-packages either, when I try to do python get-pip.py it failed to run because this file has import pip in it. So how can I install pip within a embedded python environment.

Traceback (most recent call last): File ".\getpip.py", line 20061, in main() File ".\getpip.py", line 194, in main bootstrap(tmpdir=tmpdir) File ".\getpip.py", line 82, in bootstrap import pip File "", line 961, in _find_and_load File "", line 950, in _find_and_load_unlocked File "", line 646, in _load_unlocked File "", line 616, in _load_backward_compatible

The directory structure is:

Directory: C:\Downloads\python-3.6.1rc1-embed-win32

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         3/4/2017   7:26 PM         157344 pyexpat.pyd
-a----         3/4/2017   7:26 PM          97952 python.exe
-a----         3/4/2017   7:26 PM          58016 python3.dll
-a----         3/4/2017   7:26 PM        3263648 python36.dll
-a----         3/4/2017   7:26 PM        2209284 python36.zip
-a----         3/4/2017   7:26 PM             79 python36._pth
-a----         3/4/2017   7:26 PM          96416 pythonw.exe
-a----         3/4/2017   7:26 PM          23200 select.pyd
-a----         3/4/2017   7:26 PM         866464 sqlite3.dll
-a----         3/4/2017   7:26 PM         895648 unicodedata.pyd
-a----         3/4/2017   7:26 PM          83784 vcruntime140.dll
-a----         3/4/2017   7:26 PM          24224 winsound.pyd
-a----         3/4/2017   7:26 PM          45216 _asyncio.pyd
-a----         3/4/2017   7:26 PM          77984 _bz2.pyd
-a----         3/4/2017   7:26 PM         101536 _ctypes.pyd
-a----         3/4/2017   7:26 PM         215712 _decimal.pyd
-a----         3/4/2017   7:26 PM         156832 _elementtree.pyd
-a----         3/4/2017   7:26 PM        1042592 _hashlib.pyd
-a----         3/4/2017   7:26 PM         183456 _lzma.pyd
-a----         3/4/2017   7:26 PM          32416 _msi.pyd
-a----         3/4/2017   7:26 PM          25760 _multiprocessing.pyd
-a----         3/4/2017   7:26 PM          33952 _overlapped.pyd
-a----         3/4/2017   7:26 PM          61600 _socket.pyd
-a----         3/4/2017   7:26 PM          64160 _sqlite3.pyd
-a----         3/4/2017   7:26 PM        1458848 _ssl.pyd
Cœur
  • 37,241
  • 25
  • 195
  • 267
fluter
  • 13,238
  • 8
  • 62
  • 100
  • get-pip is able to install pip even if pip isn't installed. Are you sure you're running in the conext of the embedded python? Can you show the "WHERE" that the python executable is running from? – nir0s Mar 08 '17 at 19:19
  • @nir0s where do you mean where? I run it from the folder that was unzipped with the zip file. – fluter Mar 09 '17 at 01:28
  • That's what I'm asking. Which folder? Can you print the directory contents of that folder? – nir0s Mar 09 '17 at 11:48
  • @nir0s I have updated the post with the folder contents. – fluter Mar 09 '17 at 13:02
  • Related: [Adding packages to Python “embedded” installation for Windows](https://stackoverflow.com/questions/49737721/adding-packages-to-python-embedded-installation-for-windows) – idbrii Jul 31 '21 at 01:59

6 Answers6

82

Even if explicitly stated that the embeddable version of Python does not support Pip, it is possible with care. You need to:

  1. Download and unzip Python embeddable zip file.

  2. In the file python39._pth or similar, uncomment the import command. Result should look similar to this:

    python39.zip
    .
    import site
    
  3. Download get-pip.py to the Python install folder

  4. Run get-pip.py. this installs Pip into the Scripts directory:

    python get-pip.py
    
  5. Run Pip directly from command line as Pip is a executable program (this example is to install Pandas):

    .\Scripts\pip install pandas
    

You could find more information about this in the Pip issue 4207

Zombo
  • 1
  • 62
  • 391
  • 407
oyon
  • 821
  • 1
  • 6
  • 4
  • 3
    pip install fine but then won't run properly or at all. "_pth" file needs a touch: add ".\Lib\site-packages\" below "." – Yılmaz Durmaz Oct 10 '18 at 10:01
  • 4
    and I have just found out that deleting/renaming "_pth" file frees this installation from embedded. with "_pth" file python will not recognize any other environment variable, especially PYTHONPATH. – Yılmaz Durmaz Oct 10 '18 at 10:33
  • 1
    @YılmazDurmaz Very late here... but did you come across any negative consequences wrt deleting `python36._pth`? Just did this, and it worked like a charm... but feels too good to be true. – RTbecard Dec 31 '19 at 23:09
  • 1
    "._pth" is related to run the installation in a confined environment. deleting it frees, but still, there are problems of course, because we have only ".pyc" files for libraries, not the sources. there won't be code completion, for example, in IDEs because of this. @RTbecard – Yılmaz Durmaz Jan 02 '20 at 14:28
  • you should leave "import site" uncommented after installing pip, it will let "\lib\site-packages" in sys.path @rnso – tinyhare Feb 07 '20 at 04:33
  • @RTbecard deleting `python36._pth` turns the embedded version back to a normal version and it'll run off your local environment variables. – Nelson Jan 26 '23 at 07:43
18

how I installed pip into an embeddable python distribution:

  1. unpack the python embeddable distro archive and cd there
  2. run python ./get-pip.py (got here)
  3. EITHER just uncomment string import site inside file pythonXX._pth OR copy folders (at least pip) from the newly-created folder Lib/site-packages/ into pythonXX.zip

now it's possible to python -m pip ...

alexey
  • 401
  • 4
  • 7
  • 1
    With python38-64 on Win: pip can't install any packages. ErrMsg: `import distlib ModuleNotFoundError: No module named 'distlib'`. `distlib` can be another package. – Boris Brodski Apr 28 '20 at 12:56
12

I recently ran into the same issue. I checked the documentation for pip and they seem to say that this use case isn't supported etc. But anyhow, here is my hack for getting the modules to work.

I installed, and by that I mean unzipped embedded python into a directory called d:\python. I assumed that the modules are going to live in that same directory.

First, to install the pip module, I needed to save the extraceted files. I changed the get-pip.py using a text editor that supported unix line terminators by removing the rmtree lines that remove the temporary and unpacked tree from the blob containted in the get-pip.py file.

I changed both locations, but only the last one was needed. The line that I changed in two locations read

shutil.rmtree(tmpdir, ignore_errors=True)

and I modified it thus (I didn't want to bother with the python indentation blocks):

print('shutil.rmtree(tmpdir, ignore_errors=True)')

I now ran my python D:\python\python.exe on the modified get-pip.py and found the temporary directory where the files were unzipped to.

I copied this directory, (check that it contains a main.py) file into the python install D:\python\pip (this is where I wanted my modules to live), ensuring that the D:\python\pip directory contained the main.py file.

The pip module is now installed in the python directory, but you need to hack pip further to remove the exception above. I did this by changing the locations.py file (in my case located in D:\python\pip\locations.py) to return the bin_py and bin_user locations of D:\python.

ie:

86 if WINDOWS:
....
bin_py = 'd:/python'
bin_user = 'd:/python'

I had to change the user_dir for pip to somewhere that would persist on this drive that was shared across multiple VMs.

The pip module now runs fine, eg

d:\python\python.exe -m pip ...

fluter
  • 13,238
  • 8
  • 62
  • 100
  • this work fine, thanks, but if i install 3-d side packages it put it into d:\python\Lib\site-packages and don't see – savinson Oct 22 '17 at 13:15
  • You might want to check the site paths. –  Oct 24 '17 at 21:57
  • i cant find how to add into paths 'd:\python\Lib\site-packages' permanently otherwise it make me add this path every time i use my embedded python – savinson Oct 31 '17 at 07:40
  • 1
    Yon don't need to hardcode the location, use `bin_py = os.path.dirname(sys.executable)` and `bin_user = os.path.dirname(sys.executable)` instead. – Meow Mar 21 '18 at 04:44
7

Solution for me was deleting this file:

python39._pth

This allows Pip to work, and also allow import from same directory. Alternatively you can get this:

https://nuget.org/packages/python

Click "Download package", and you can extract just like a Zip file.

Zombo
  • 1
  • 62
  • 391
  • 407
  • This works nicely! Maybe this should be the accepted answer. Thanks. – Mathias Mamsch Oct 11 '21 at 22:21
  • This just turns your embedded version into a normal version that reads your local environment variables and registry: https://github.com/pypa/pip/issues/4207#issuecomment-297399016 – Nelson Jan 26 '23 at 07:45
-1

Pip can also be accessed programatically within python as a command (this example installs pandas):

import pip
pip.main(['install'], 'pandas')

(Source: Installing python module within code)

dank8
  • 361
  • 4
  • 20
  • I tried this approach. However it spawned a subprocess calling python, and because setuptools was not on the python path, it failed. So probably better to do one of the other approaches – Jon Nordby Mar 11 '20 at 11:48
-1

download https://www.python.org/ftp/python/3.10.1/python-3.10.1-amd64.exe and install it to a Virtual box

download https://www.python.org/ftp/python/3.10.1/python-3.10.1-embed-amd64.zip and unpack it to python-3.10.1-embed-amd64

copy "include" & "libs" dirs from corresponding python installation "python-3.10.1-amd64.exe" from Virtual Box to python-3.10.1-embed-amd64

goto python-3.10.1-embed-amd64 folder and:

  • Download get-pip.py:
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
  • Execute get-pip.py:
python get-pip.py
  • rename _pth:
rename python310._pth python310._pth.renamed

set environments:

set PY_PIP=python-3.10.1-embed-amd64\Scripts
set PY_LIBS=python-3.10.1-embed-amd64\Lib;python-3.10.1-embed-amd64\Lib\site-packages

now "python -m pip install PACKETNAME" should work. PACKETNAME is tested on:

  • pywin32==302
  • psutil==5.8.0
  • pprofile==2.1.0
  • mypy==0.910
  • Pillow==8.4.0
  • cfractions==1.4.0
  • pyyaml==6.0
  • humanize==3.13.1

Note: packets installs that require to compile C/C++ are also work.

Note: 'python-3.10.1-embed-amd64' means something like c:\mypythons\python-3.10.1-embed-amd64

Smak
  • 104
  • 4