Install Python on Windows with Powershell without administrator privileges

Updated: June 26, 2018  |  4 minute read

As a Windows DevOps, I often use Powershell and Python, Powershell is installed by Windows out of box, but this is not for Python. And for my working environment, I don’t have the administrator privileges on some servers. I will show you in this post how to rapidly deploy Python on Windows as a standard user by using Powershell with Nuget.

Find Python packages

If you cannot use Find-Package to search pacakges in Nuget repository, please check my post on Setting Up Nuget for Powershell.

We will install python with version 3.6.5 and python2 with version 2.7.15.

> Find-Package python*
Name                           Version          Source           Summary
----                           -------          ------           -------
python                         3.6.5            Nuget            Installs 64-bit Python for use in build scenarios.
python-embed                   3.6.1.1          Nuget            Installs 64-bit Python for use in build scenarios a...
python2x86                     2.7.15           Nuget            Installs 32-bit Python 2.7 for use in build scenarios.
python2                        2.7.15           Nuget            Installs 64-bit Python 2.7 for use in build scenarios.
Python35                       3.5.1.1          Nuget            Python 3.5 API
Python36                       3.6.0            Nuget            Python 3.6 API
pythonAndroid-2.7-x86_64-22... 1.0.0.7          Nuget            Python 2.7 android api version: 22.0.0 architecture... pythonAndroid-2.7-armeabi-v... 1.0.0.7          Nuget            Python 2.7 android api version: 22.0.0 architecture... pythonAndroid-2.7-x86_64-23... 1.0.0.7          Nuget            Python 2.7 android api version: 23.0.0 architecture...
Python27Dev                    2.7.13           Nuget            Python 2.7 unofficial dev environment package
pythonIOS-2.7-arm64-10.3       1.0.0.7          Nuget            Python 2.7 iOS api version: 10.3 architecture: arm64
PythonPlotter                  0.2.15           Nuget            Package to allow use of matplotlib from .NET....
Python.Runtime                 2.7.9            Nuget            Python 2.7.9 as a single, stand-alone executable wi...
PythonLibs4CSharp              1.0.0            Nuget            A collection of Iron Python compiled libraries with...
pythonx86                      3.6.5            Nuget            Installs 32-bit Python for use in build scenarios.
pythonnet_py35_dotnet          2.3.0            Nuget            Python 3.5 and .NET Framework
pythonnet_py27_dotnet          2.3.0            Nuget            Python 2.7 and .NET Framework
Python27                       2.7.6            Nuget            Python 2.7 API
PythonConsoleControl           1.0.1            Nuget            PythonConsole
Python3                        3.6.3.2          PSGallery        Python3 interpreter
PythonSelect                   1.0.0            PSGallery        Select a Python distribution to use within a PowerS...
PythonConverter.dll            1.0.0            Nuget            Package description

Install Python

# To install Python 3
> Install-Package python -Scope CurrentUser

# To install Python 2
> Install-Package python2 -Scope CurrentUser

Note 2018-08-29: Current Find-Package python* -AllVersion gives the lastest python version is v3.7.0, but this version doesn’t work, the last worked Nuget python version is v3.6.6

Add Python to user path

I will show you the way to add Python3 into the user PATH, it will be the same way for Python2. I use the user PATH because I’m not admin on the Windows server, I cannot modify the system PATH.

# Get python3 package info path
> Get-Package python | % source
C:\Users\xiang\AppData\Local\

# For Nuget packages, the executable is always under the tools folder, and the tools folder is at the same level as .nupkg file.
> ls C:\Users\xiang\AppData\Local\PackageManagement\NuGet\Packages\python.3.6.5\tools\

    Directory: C:\Users\xiang\AppData\Local\PackageManagement\NuGet\Packages\python.3.6.5\tools

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2018-06-26     00:15                DLLs
d-----       2018-06-26     00:15                include
d-----       2018-06-26     00:16                Lib
d-----       2018-06-26     00:15                libs
d-----       2018-06-26     00:49                Scripts
d-----       2018-06-26     00:15                Tools
-a----       2018-03-28     17:10         100504 python.exe
-a----       2018-03-28     17:10          58520 python3.dll
-a----       2018-03-28     17:10        3610776 python36.dll
-a----       2018-03-28     17:10          98968 pythonw.exe
-a----       2018-03-28     17:10          88752 vcruntime140.dll

# python needs to add 2 paths to the user PATH, one is the root folder containing python.exe, another is the Sripts folder.
> $pythonRootFolder = Join-Path (Split-Path (Get-Package python | % source)) "tools"
> $pythonScriptsFolder = Join-Path $pythonRootFolder "Scripts"
> $path = [System.Environment]::GetEnvironmentVariable('path', 'user')
> $path += ";$pythonRootFolder"
> $path += ";$pythonScriptsFolder;"
> [System.Environment]::SetEnvironmentVariable('path', $path, 'user')

Reinstall pip

The default pip3.exe and pip2.exe have some strange behavior that just don’t work :

> pip3
Fatal error in launcher: Unable to create process using '"'

> pip2
Fatal error in launcher: Unable to create process using '"'

You can bypass the issue by using python -m pip, but I like to use pip directly without python -m, the trick is just reinstalling the pip:

> python -m pip uninstall pip -y
> python -m ensurepip

Normally python -m ensurepip will install pip v9, if you want to install pip v10, just upgrade the v9:

> pip3  --version
pip 9.0.3 from c:\users\xiang\appdata\local\packagemanagement\nuget\packages\python.3.6.5\tools\lib\site-packages (python 3.6)

> python -m pip install -U pip
Collecting pip
  Using cached https://files.pythonhosted.org/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 9.0.3
    Uninstalling pip-9.0.3:
      Successfully uninstalled pip-9.0.3
Successfully installed pip-10.0.1

> pip3 --version
pip 10.0.1 from c:\users\xiang\appdata\local\packagemanagement\nuget\packages\python.3.6.5\tools\lib\site-packages\pip (python 3.6)

And we can find that when installing pip v10, the pip.exe is installed too, while in pip v9, we only have pip3.exe.

> ls C:\Users\xiang\AppData\Local\PackageManagement\NuGet\Packages\python.3.6.5\tools\Scripts\

    Directory: C:\Users\xiang\AppData\Local\PackageManagement\NuGet\Packages\python.3.6.5\tools\Scripts

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-03-28     17:10          98187 easy_install-3.6.exe
-a----       2018-06-26     00:49         102812 pip.exe
-a----       2018-06-26     00:49         102812 pip3.6.exe
-a----       2018-06-26     00:49         102812 pip3.exe
-a----       2018-06-26     00:29          98224 ptipython.exe
-a----       2018-06-26     00:29          98224 ptipython3.exe
-a----       2018-06-26     00:29          98223 ptpython.exe
-a----       2018-06-26     00:29          98223 ptpython3.exe
-a----       2018-06-26     00:29          98207 pygmentize.exe

Update on 2018-07-27: The pip version has been jumped from v10 to v18 directly, because PyPA switches the software versioning to CalVer

Configure pip for PyPI

If you’re in enterprise environment, you may probably dont have access to the public Python packages repository https://pypi.org/, and in this case, your enterprise should have a local Artifactory which mirrors the public https://pypi.org/. So you need to add your enterprise Artifactory PyPI URL to you Python pip conf.

You can find all the pip configuration details here.

For JFrog Artifactory: https://www.jfrog.com/confluence/display/RTF/PyPI+Repositories

Leave a comment