Loading....
Keyboard with Serverless Logos on the Keys

With serverless becoming more prevalent and cloud vendors offering more and more languages and tools support, the choices for developers are increasing. However, with more choices, the set up of a development environment becomes more challenging. I love VS Code and Python is my favorite development language. Also, I think that Microsoft’s approach for allowing developers to run Azure Functions locally is a winning one. Of course, setting up your local environment for developing Azure Functions in Python is not a one-click task.

What Do You Need?

Here are the things that you will need:

  • VS Code installed on your development machine
  • Python interpreter (when on Windows, I prefer Anaconda but pure Python will be fine too)

Setting Up Python Development in VS Code

For Python development in VS Code, you would obviously want to install the official Python plugin from Microsoft. It is highly rated, includes pylint, IntelliSense, highlighting, and quite a few other cool features.

Now, here is one kink that you need to be aware of. When you initially set up the Python plugin, you are asked to select your interpreter:

VS Code Select Python Interpreter

This will be the default interpreter that will be used every time when you work on a Python script. This same interpreter will also be used to create the virtual environments for your Azure Functions projects, but about this later.

Note: One thing to note here. If you use Anaconda, make sure that the path to the conda executable it available in the PATH environment variable. Else, VS Code will show errors when trying to start the interpreter.

Now, if you have more than one Python version installed on your machine, you can easily switch between versions from the lower-left corner of the VS Code window:

VS Code Change Python Interpreter

Once again, the last version that you select for the Python interpreter will be us as the default version for the Python plugin. You can always verify the current PYTHON_PATH in the plugin settings in VS Code (File –> Preferences –> Settings):

VS Code Python Path Setting

This default setting can become problematic. For example, Azure Functions V2 do not support Python 3.8, and you have to use 3.7 as an interpreter. If the wrong Python version is selected when you debug your Azure Functions project, you will experience issues (about this later). So, I would recommend that you pay attention to this every time you restart your VS Code or start a new Python project.

Setting Up VS Code for Azure Functions Development

More Python Set Up in VS Code

Now, let’s look at what you need to do to set up VS Code for the development of Azure Functions. Obviously, you will need the Azure Functions plugin for VS Code. But this is not enough! First, let’s look at a few other things that you need to pay attention to while creating the Functions project.

VS Code Create Python Function Project

After selecting Python as a language, you are asked to select a Python interpreter. The plugin is smart enough to give you only the supported options. In my case below, the Python 3.8.3 environment is not shown.

VS Code Select Python Interpreter Filtered Python Version

VS Code will use the selected interpreter to create a virtual environment for the project. The virtual environment will be available under the .venv subfolder of the project. While you may think all is good, here are a few things to notice:

  • The first thing is that the linter cannot find the azure.functions module:

VS Code Python Functions Missing Module

  • Second, the selected Python interpreter is the one used to create the virtual environment, and not the one from the virtual environment:

VS Code Selected Python Interpreter

If you select the correct Python interpreter (the one from the virtual environment), those two errors will disappear. However, you will get a popup that the pylint linter is not installed:

VS Code Pylint Not Installed

The reason for that is that the linter binaries are installed for the original Python environment. Clicking on the Install will try to install the linter in the virtual environment set up for the project that you just created.

Here you will hit some challenges.

  • First, you may see the following PowerShell error:
PS C:\Users\someuser\Documents\Temp\az-function-test> & c:/Users/memladen/Documents/Temp/az-function-test/.venv/Scripts/Activate.ps1
& : File C:\Users\someuser\Documents\Temp\az-function-test\.venv\Scripts\Activate.ps1 cannot be loaded because running scripts is disabled on this system. For more  
information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:3
+ & c:/Users/someuser/Documents/Temp/az-function-test/.venv/Scripts/Act ...
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

That is a bummer because this means that your virtual environment will not get activated in the Terminal.

  • The second issue that you will see is the following:
PS C:\Users\someuser\Documents\Temp\az-function-test> & c:/Users/someuser/Documents/Temp/az-function-test/.venv/Scripts/python.exe c:\Users\someuser\.vscode\extensions\ms-python.python-2020.6.91350\pythonFiles\pyvsc-run-isolated.py pip install -U pylint
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Collecting pylint
  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/pylint/
  WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/pylint/
  WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/pylint/
  WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/pylint/
  WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/pylint/
  Could not fetch URL https://pypi.org/simple/pylint/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pylint/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
  ERROR: Could not find a version that satisfies the requirement pylint (from versions: none)
ERROR: No matching distribution found for pylint
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping

Unfortunately, you will need to solve both errors. Now, here an interesting thing! I opened the problematic PowerShell script by double-clicking on it, and it executed in a new Terminal window without errors (about this later):

VS Code Execute Python Virtual Environment Script

After some investigation, here is what I discovered. Depending on what you have selected as your Default Shell for the Terminal window, you may or may not encounter errors executing the activation script. Here is what I had as options:

Default Terminal Shell Selection in VS Code

You can get to this selection from the Terminal window if you click on the arrow next to the shell:

Select Default Terminal Shell in VS Code

Here is what happens, if you select each one of those options and open a new Terminal window:

  • Selecting the Command Prompt as the default shell triggers the execution of the activate.bat file that successfully activates the Python virtual environment.

Activating Python Virtual Environment Using Command Prompt

  • Selecting Git Bash (you may not have this one if you have not installed Git Bash, but most VS Code users do have it because VS Code prompts you early enough to install it) calls the Bash activation script and successfully activates your Python virtual environment.

Activating Python Virtual Environment Using Bash

  • I do have PowerShell 7 installed on my machine. Selecting that option executes the Activate.ps1 script without problems and activates the Python virtual environment.

Activating Python Virtual Environment Using PowerShell 7

  • So, the only unfortunate option is the Windows Power Shell option, which (for whatever reason) is the default Terminal option in VS Code.

So, the recommendation here is to change the Default Shell in VS Code from Windows Power Shell to Command Prompt, Bash, or if you have PowerShell 7.

About the second error… Well, the reason for that error is that there is no path to the libcrypto* and libssl* DLLs needed for pip to establish the HTTPS connection. Here is a link to a GitHub Issue related to this problem, that can be helpful if you are using Anaconda. Even if you are not using Anaconda, you need to have the path to the DLLs in your PATH environment variable. Adding the following locations to the PATH environment variable and restarting VS Code will help you solve the issue:

~\Anaconda3
~\Anaconda3\Library\mingw-w64\bin
~\Anaconda3\Library\usr\bin
~\Anaconda3\Library\bin
~\Anaconda3\Scripts
~\Anaconda3\bin
~\Anaconda3\condabin

Where ~ is your home folder on Windows. If you do not use Anaconda, find the appropriate folders for your Python distribution. After doing this, you will be able to install the pylint Linter and use Python and pip from the VS Code Terminal.

It seems we’ve spent most of the time fixing the Python setup instead of configuring the Azure Functions development environment. To summarize, the two things that you need to do to properly complete the set-up of VS Code with Python is:

  1. Select a Default Shell for the VS Code Terminal that is different from the Windows Power Shell
  2. Add the Python binaries locations to the PATH environment variable

Installing the Azure Functions Core Tools

Now, let’s get back to setting up the Functions development environment. We’ve cleared the import error but running the Azure Function code locally (by pressing F5) fails with the following:

VS Code Missing Azure Functions Core Tools Dialog

The Learn more button sends us to the Azure Functions Core Tools page on GitHub.

To install the Azure Functions Core Tools, you have two options:

  1. To use npm, which is the JavaScript package manager
  2. Or to use chocolatey, which is the (new) package manager for Windows software

Having in mind that I do some JavaScript development, I opt out for npm and node.js on my machine. So, if having Node.JS on your machine is something you will find useful, go to nodejs.org and install it. If you don’t think you will ever use JavaScript for development, you can head to chocolatey.org and install Chocolatey. One interesting thing is that if you install Node.JS, you will also have the option to install Chocolatey (and Python) as one of the required tools for building modules.

NodeJS Tools Installation Window

If you select the option to install the “necessary tools”, you will (most probably) end up (like me) with one more version of Python on your machine. Remember to choose the right one when you create your Azure Functions project next time.

Installing the Azure Functions Core Tools with either one of those is trivial if you follow the Microsoft instructions on GitHub. However, make sure that you install the correct version of the tools – you can choose between and V2 and V3. You can learn about the differences on Azure’s Documentation Site.

Wrapping Up

To wrap up – although VS Code is quite a convenient Editor/IDE, setting it up for the development of Azure Functions in Python is a quite elaborate process. In addition to installing a bunch of things, you need to be careful when selecting Python versions and default shells. Hopefully, this article will help you overcome those hurdles and get your development going.

References

Here some additional references.

  • How to configure environment variables on Windows, Linux, and macOS?
, ,

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Back To Top