Visual Studio Run Python Script



It sounds very obvious to many but, for those who are new to Python as well as Visual Studio Code I would like to inform you that Visual Studio Code can be used to debug and run Python code. But, ‘Visual Studio Code doesn’t come with Python‘. So, we will have to install python separately. To run Python scripts with the python command, you need to open a command-line and type in the word python, or python3 if you have both versions, followed by the path to your script, just like this: $ python3 hello.py Hello World! If everything works okay, after you press Enter, you’ll see.

Your Python code can be up on a code editor, IDE or a file. And, it won’t work unless you know how to execute your Python script.

In this blog post, we will take a look at 7 ways to execute Python code and scripts. No matter what your operating system is, your Python environment or the location of your code – we will show you how to execute that piece of code!

Table of Contents

  1. Running Python Code Interactively
  2. How are Python Script is Executed
  3. How to Run Python Scripts
  4. How to Run Python Scripts using Command Line
  5. How to Run Python Code Interactively
  6. Running Python Code from a Text Editor
  7. Running Python Code from an IDE
  8. How to Run Python Scripts from a File Manager
  9. How to Run Python Scripts from Another Python Script

Where to run Python scripts and how?

You can run a Python script from:

  1. OS Command line (also known as shell or Terminal)
  2. Run Python scripts with a specific Python Version on Anaconda
  3. Using a Crontab
  4. Run a Python script using another Python script
  5. Using FileManager
  6. Using Python Interactive Mode
  7. Using IDE or Code Editor

Running Python Code Interactively

To start an interactive session for Python code, simply open your Terminal or Command line and type in Python(or Python 3 depending on your Python version). And, as soon as you hit enter, you’ll be in the interactive mode.

Here’s how you enter interactive mode in Windows, Linux and MacOS.

Interactive Python Scripting Mode On Linux

Open up your Terminal.

It should look something like

Enter the Python script interactive mode after pressing “Enter”.

Interactive Python Scripting Mode On Mac OSX

Launching interactive Python script mode on Mac OS is pretty similar to Linux. The image below shows the interactive mode on Mac OS.

Interactive Python Scripting Mode On Windows

On Windows, go to your Command Prompt and write “python”. Once you hit enter you should see something like this:

Running Python Scripts Interactively

With interactive Python script mode, you can write code snippets and execute them to see if they give desired output or whether they fail.

Take an example of the for loop below.

Recommended Python Training

For Python training, our top recommendation is DataCamp.

Our code snippet was written to print everything including 0 and upto 5. So, what you see after print(i) is the output here.

To exit interactive Python script mode, write the following:

And, hit Enter. You should be back to the command line screen that you started with initially.

There are other ways to exit the interactive Python script mode too. With Linux you can simply to Ctrl + D and on Windows you need to press Ctrl + Z + Enter to exit.

Note that when you exit interactive mode, your Python scripts won’t be saved to a local file.

How are Python scripts executed?

A nice way to visualize what happens when you execute a Python script is by using the diagram below. The block represents a Python script (or function) we wrote, and each block within it, represents a line of code.

When you run this Python script, Python interpreter goes from top to bottom executing each line.

And, that’s how Python interpreter executes a Python script.

But that’s not it! There’s a lot more that happens.

Flow Chart of How Python Interpreter Runs Codes

Step 1: Your script or .py file is compiled and a binary format is generated. This new format is in either .pyc or .pyo.

Step 2: The binary file generated, is now read by the interpreter to execute instructions.

Think of them as a bunch of instructions that leads to the final outcome.

There are some benefits of inspecting bytecode. And, if you aim to turn yourself into a pro level Pythonista, you may want to learn and understand bytecode to write highly optimized Python scripts.

You can also use it to understand and guide your Python script’s design decisions. You can look at certain factors and understand why some functions/data structures are faster than others.

How to run Python scripts?

To run a Python script using command line, you need to first save your code as a local file.

Let’s take the case of our local Python file again. If you were to save it to a local .py file named python_script.py.

There are many ways to do that:

  1. Create a Python script from command line and save it
  2. Create a Python script using a text editor or IDE and save it

Saving a Python script from a code editor is pretty easy. Basically as simple as saving a text file.

But, to do it via Command line, there are a couple of steps involved.

First, head to your command line, and change your working directory to where you wish to save the Python script.

Once you are in the right directory, execute the following command in Terminal:

Once you hit enter, you’ll get into a command line interface that looks something like this:

Now, you can write a Python code here and easily run it using command line.

How to run Python scripts using command line?

Python scripts can be run using Python command over a command line interface. Make sure you specify the path to the script or have the same working directory. To execute your Python script(python_script.py) open command line and write python3 python_script.py

Replace python3 with python if your Python version is Python2.x.

Here’s what we saved in our python_script.py

And, the output on your command line looks something like this

Let’s say, we want to save the output of the Python code which is 0, 1, 2, 3, 4 – we use something called a pipe operator.

In our case, all we have to do is:

And, a file named “newfile.txt” would be created with our output saved in it.

How to run Python code interactively

There are more than 4 ways to run a Python script interactively. And, in the next few sections we will see all major ways to execute Python scripts.

Using Import to run your Python Scripts

We all use import module to load scripts and libraries extremely frequently. You can write your own Python script(let’s say code1.py) and import it into another code without writing the whole code in the new script again.

Here’s how you can import code1.py in your new Python script.

But, doing so would mean that you import everything that’s in code1.py to your Python code. That isn’t an issue till you start working in situations where your code has to be well optimized for performance, scalability and maintainability.

So, let’s say, we had a small function inside code1 that draws a beautiful chart e.g. chart_code1(). And, that function is the only reason why we wish to import the entire code1.py script. Rather than having to call the entire Python script, we can simply call the function instead.

Here’s how you would typically do it

And, you should be able to use chart_code1 in your new Python script as if it were present in your current Python code.

Next, let’s look at other ways to import Python code.

Using and importlib to run Python code

import_module() of importlib allows you to import and execute other Python scripts.

The way it works is pretty simple. For our Python script code1.py, all we have to do is:

There’s no need to add .py in import_module().

Let’s go through a case where we have complex directory structures and we wish to use importlib. Directory structure of the Python code we want to run is below:

level1

|

+ – __init__.py

– level2

|

+ – __init__.py

– level3.py

In this case if you think you can do importlib.import_module(“level3”), you’ll get an error. This is called relative import, and the way you do it is by using a relative name with anchor explicit.

So, to run Python script level3.py, you can either do

or you can do

Run Python code using runpy

Runpy module locates and executes a Python script without importing it. Usage is pretty simple as you can easily call the module name inside of run_module().

To execute our code1.py module using runpy. Here’s what we will do.

Run Python Code Dynamically

We are going to take a look at exec() function to execute Python scripts dynamically. In Python 2, exec function was actually a statement.

Here’s how it helps you execute a Python code dynamically in case of a string.

Dynamic Code Was Executed

However, using exec() should be a last resort. As it is slow and unpredictable, try to see if there are any other better alternatives available.

Running Python Scripts from a Text Editor

To run Python script using a Python Text Editor you can use the default “run” command or use hot keys like Function + F5 or simply F5(depending on your OS).

Here’s an example of Python script being executed in IDLE.

Source: pitt.edu

However, note that you do not control the virtual environment like how you typically would from a command line interface execution.

That’s where IDEs and Advanced text editors are far better than Code Editors.

Running Python Scripts from an IDE

When it comes to executing scripts from an IDE, you can not only run your Python code, but also debug it and select the Python environment you would like to run it on.

While the IDE’s UI interface may vary, the process would be pretty much similar to save, run and edit a code.

How to run Python scripts from a File Manager

What if there was a way to run a Python script just by double clicking on it? You can actually do that by creating executable files of your code. For example, in the case of Windows OS, you can simply create a .exe extension of your Python script and run it by double clicking on it.

How to run Python scripts from another Python script

Although we haven’t already stated this, but, if you go back up and read, you’ll notice that you can:

  1. Run a Python script via a command line that calls another Python script in it
  2. Use a module like import to load a Python script

That’s it!

Key Takeaway

  1. You can write a Python code in interactive and non interactive modes. Once you exit interactive mode, you lose the data. So, sudo nano your_python_filename.py it!
  2. You can also run your Python Code via IDE, Code Editors or Command line
  3. There are different ways to import a Python code and use it for another script. Pick wisely and look at the advantages and disadvantages.
  4. Python reads the code you write, translates it into bytecodes, which are then used as instructions – all of that happen when you run a Python script. So, learn how to use bytecode to optimize your Python code.

Recommended Python Training

For Python training, our top recommendation is DataCamp.

The Python extension supports testing with Python's built-in unittest framework as well as pytest. Nose is also supported, although the framework itself is in maintenance mode.

After enabling a test framework, use the Python: Discover Tests command to scan the project for tests according to the discovery patterns of the currently selected test framework. Once discovered, Visual Studio Code provides a variety of means to run tests and debug tests. VS Code displays test output in the Python Test Log panel, including errors caused when a test framework is not installed. With pytest, failed tests also appear in the Problems panel.

A little background on unit testing

(If you're already familiar with unit testing, you can skip to the walkthroughs.)

A unit is a specific piece of code to be tested, such as a function or a class. Unit tests are then other pieces of code that specifically exercise the code unit with a full range of different inputs, including boundary and edge cases.

Visual Studio Code Python

For example, say you have a function to validate the format of an account number that a user enters in a web form:

Unit tests are concerned only with the unit's interface—its arguments and return values—not with its implementation (which is why no code is shown here in the function body; often you'd be using other well-tested libraries to help implement the function). In this example, the function accepts any string and returns true if that string contains a properly formatted account number, false otherwise.

To thoroughly test this function, you want to throw at it every conceivable input: valid strings, mistyped strings (off by one or two characters, or containing invalid characters), strings that are too short or too long, blank strings, null arguments, strings containing control characters (non-text codes), string containing HTML, strings containing injection attacks (such as SQL commands or JavaScript code), and so on. It's especially important to test security cases like injection attacks if the validated string is later used in database queries or displayed in the app's UI.

For each input, you then define the function's expected return value (or values). In this example, again, the function should return true for only properly formatted strings. (Whether the number itself is a real account is a different matter that would be handled elsewhere through a database query.)

With all the arguments and expected return values in hand, you now write the tests themselves, which are pieces of code that call the function with a particular input, then compare the actual return value with the expected return value (this comparison is called an assertion):

The exact structure of the code depends on the test framework you're using, and specific examples are provided later in this article. In any case, as you can see, each test is very simple: invoke the function with an argument and assert the expected return value.

Run Python Script In Visual Studio 2017

The combined results of all the tests is your test report, which tells you whether the function (the unit), is behaving as expected across all test cases. That is, when a unit passes all of its tests, you can be confident that it's functioning properly. (The practice of test-driven development is where you actually write the tests first, then write the code to pass more and more tests until all of them pass.)

Because unit tests are small, isolated piece of code (in unit testing you avoid external dependencies and use mock data or otherwise simulated inputs), they're quick and inexpensive to run. This characteristic means that you can run unit tests early and often. Developers typically run unit tests even before committing code to a repository; gated check-in systems can also run unit tests before merging a commit. Many continuous integration systems also run unit tests after every build. Running the unit test early and often means that you quickly catch regressions, which are unexpected changes in the behavior of code that previously passed all its unit tests. Because the test failure can easily be traced to a particular code change, it's easy to find and remedy the cause of the failure, which is undoubtedly better than discovering a problem much later in the process!

For a general background on unit testing, see Unit Testing on Wikipedia. For a variety of useful unit test examples, see https://github.com/gwtw/py-sorting, a repository with tests for different sorting algorithms.

Example test walkthroughs

Python tests are Python classes that reside in separate files from the code being tested. Each test framework specifies the structure and naming of tests and test files. Once you write tests and enable a test framework, VS Code locates those tests and provides you with various commands to run and debug them.

For this section, create a folder and open it in VS Code. Then create a file named inc_dec.py with the following code to be tested:

With this code, you can experience working with tests in VS Code as described in the sections that follow.

Enable a test framework

Testing in Python is disabled by default. To enable testing, use the Python: Configure Tests command on the Command Palette. This command prompts you to select a test framework, the folder containing tests, and the pattern used to identify test files.

You can also configure testing manually by setting one and only one of the following settings to true: python.testing.unittestEnabled, python.testing.pytestEnabled, and python.testing.nosetestsEnabled. Each framework also has specific configuration settings as described under Test configuration settings for their folders and patterns.

It's important that you enable only a single test framework at a time. For this reason, when you enable one framework also be sure to disable the others. The Python: Configure Tests command does this automatically.

When you enable a test framework, VS Code prompts you to install the framework package if it's not already present in the currently activated environment:

Create tests

Visual Studio Run Python Script

Each test framework has its own conventions for naming test files and structuring the tests within, as described in the following sections. Each case includes two test methods, one of which is intentionally set to fail for the purposes of demonstration.

Because Nose is in maintenance mode and not recommended for new projects, only unittest and pytest examples are shown in the sections that follow. (Nose2, the successor to Nose, is just unittest with plugins, and so it follows the unittest patterns shown here.)

Tests in unittest

Create a file named test_unittest.py that contains a test class with two test methods:

Tests in pytest

Create a file named test_pytest.py that contains two test methods:

Test discovery

VS Code uses the currently enabled testing framework to discover tests. You can trigger test discovery at any time using the Python: Discover Tests command.

python.testing.autoTestDiscoverOnSaveEnabled is set to true by default, meaning test discovery is performed automatically whenever you save a test file. To disable this feature, set the value to false.

Test discovery applies the discovery patterns for the current framework (which can be customized using the Test configuration settings). The default behavior is as follows:

  • python.testing.unittestArgs: Looks for any Python (.py) file with 'test' in the name in the top-level project folder. All test files must be importable modules or packages. You can customize the file matching pattern with the -p configuration setting, and customize the folder with the -t setting.

  • python.testing.pytestArgs: Looks for any Python (.py) file whose name begins with 'test_' or ends with '_test', located anywhere within the current folder and all subfolders.

Tip: Sometimes tests placed in subfolders aren't discovered because such test files cannot be imported. To make them importable, create an empty file named __init__.py in that folder.

If discovery succeeds, the status bar shows Run Tests instead:

If discovery fails (for example, the test framework isn't installed), you see a notification on the status bar. Selecting the notification provides more information:

Once VS Code recognizes tests, it provides several ways to run those tests as described in Run tests. The most obvious means are CodeLens adornments that appear directly in the editor and allow you to easily run a single test method or, with unittest, a test class:

Note: At present, the Python extension doesn't provide a setting to turn the adornments on or off. To suggest a different behavior, file an issue on the vscode-python repository.

For Python, test discovery also activates the Test Explorer with an icon on the VS Code activity bar. The Test Explorer helps you visualize, navigate, and run tests:

Run tests

You run tests using any of the following actions:

  • With a test file open, select the Run Test CodeLens adornment that appears above a test method or a class, as shown in the previous section. This command runs only that one method or only those tests in the class.

  • Select Run Tests on the Status Bar (which can change appearance based on results),

    then select one of the commands like Run All Tests or Discover Tests:

  • In Test Explorer:

    • To run all discovered tests, select the play button at the top of Test Explorer:

    • To run a specific group of tests, or a single test, select the file, class, or test, then select the play button to the right of that item:

  • Right-click a file in Explorer and select Run All Tests, which runs the tests in that one file.

  • From the Command Palette, select any of the run test commands:

    CommandDescription
    Debug All TestsSee Debug tests.
    Debug Test MethodSee Debug tests.
    Run All TestsSearches for and runs all tests in the workspace and its subfolders.
    Run Current Test FileRuns the test in the file that's currently viewed in the editor.
    Run Failed TestsRe-runs any tests that failed in a previous test run. Runs all test if no tests have been run yet.
    Run Test FilePrompts for a specific test filename, then runs the test in that file.
    Run Test MethodPrompts for the name of a test to run, providing auto-completion for test names.
    Show Test OutputOpens the Python Test Log panel with information about passing and failing tests, as well as errors and skipped tests.

After a test run, VS Code displays results directly with the CodeLens adornments in the editor and in Test Explorer. Results are shown both for individual tests as well as any classes and files containing those tests. Failed tests are also adorned in the editor with a red underline.

VS Code also shows test results in the Python Test Log output panel (use the View > Output menu command to show the Output panel, then select Python Test Log from the dropdown on the right side):

With pytest, failed tests also appear in the Problems panel, where you can double-click on an issue to navigate directly to the test:

Run tests in parallel

Support for running tests in parallel with pytest is available through the pytest-xdist package. To enable parallel testing:

  1. Open the integrated terminal and install the pytest-xdist package. For more details refer to the project's documentation page.

    For Windows

    For macOS/Linux

  2. Next, create a file named pytest.ini in your project directory and add the content below, specifying the number of CPUs to be used. For example, to set it up for 4 CPUs:

  3. Run your tests, which will now be run in parallel.

Debug tests

You might occasionally need to step through and analyze tests in the debugger, either because the tests themselves have a code defect you need to track down or in order to better understand why an area of code being tested is failing.

For example, the test_decrement functions given earlier are failing because the assertion itself is faulty. The following steps demonstrate how to analyze the test:

  1. Set a breakpoint on first the line in the test_decrement function.

  2. Select the Debug Test adornment above that function or the 'bug' icon for that test in Test Explorer. VS Code starts the debugger and pauses at the breakpoint.

  3. In the Debug Console panel, enter inc_dec.decrement(3) to see that the actual result is 2, whereas the expected result specified in the test is the incorrect value of 4.

  4. Stop the debugger and correct the faulty code:

  5. Save the file and run the tests again to confirm that they pass, and see that the CodeLens adornments also indicate passing status.

    Note: running or debugging a test does not automatically save the test file. Always be sure to save changes to a test before running it, otherwise you'll likely be confused by the results because they still reflect the previous version of the file!

The Python: Debug All Tests and Python: Debug Test Method commands (on both the Command Palette and Status Bar menu) launch the debugger for all tests and a single test method, respectively. You can also use the 'bug' icons in Test Explorer to launch the debugger for all tests in a selected scope as well as all discovered tests.

The debugger works the same for tests as for other Python code, including breakpoints, variable inspection, and so on. To customize settings for debugging tests, you can specify 'request':'test' in the launch.json file in the .vscode folder from your workspace. This configuration will be used when you run Python: Debug All Tests and Python: Debug Test Method commands.

For example, the configuration below in the launch.json file disables the justMyCode setting for debugging tests:

If you have more than one configuration entry with 'request':'test', the first definition will be used since we currently don't support multiple definitions for this request type.

For more information on debugging, see Python debugging configurations and the general VS Code Debugging article.

Test configuration settings

The behavior of testing with Python is driven by both general settings and settings that are specific to whichever framework you've enabled.

General settings

Setting
(python.testing.)
DefaultDescription
autoTestDiscoverOnSaveEnabledtrueSpecifies whether to enable or disable auto run test discovery when saving a test file.
cwdnullSpecifies an optional working directory for tests.
debugPort3000Port number used for debugging of unittest tests.
promptToConfiguretrueSpecifies whether VS Code prompts to configure a test framework if potential tests are discovered.

unittest configuration settings

Setting
(python.testing.)
DefaultDescription
unittestEnabledfalseSpecifies whether unittest is enabled as the test framework. All other frameworks should be disabled.
unittestArgs['-v', '-s', '.', '-p', '*test*.py']Arguments to pass to unittest, where each element that's separated by a space is a separate item in the list. See below for a description of the defaults.

The default arguments for unittest are as follows:

  • -v sets default verbosity. Remove this argument for simpler output.
  • -s . specifies the starting directory for discovering tests. If you have tests in a 'test' folder, change the argument to -s test (meaning '-s', 'test' in the arguments array).
  • -p *test*.py is the discovery pattern used to look for tests. In this case, it's any .py file that includes the word 'test'. If you name test files differently, such as appending '_test' to every filename, then use a pattern like *_test.py in the appropriate argument of the array.

To stop a test run on the first failure, add the fail fast option '-f' to the arguments array.

See unittest command-line interface for the full set of available options.

pytest configuration settings

Setting
(python.testing.)
DefaultDescription
pytestEnabledfalseSpecifies whether pytest is enabled as the test framework. All other frameworks should be disabled.
pytestPath'pytest'Path to pytest. Use a full path if pytest is located outside the current environment.
pytestArgs[]Arguments to pass to pytest, where each element that's separated by a space is a separate item in the list. See pytest command-line options.

You can also configure pytest using a pytest.ini file as described on pytest Configuration.

Note If you have the pytest-cov coverage module installed, VS Code doesn't stop at breakpoints while debugging because pytest-cov is using the same technique to access the source code being run. To prevent this behavior, include --no-cov in pytestArgs when debugging tests, for example by adding 'env': {'PYTEST_ADDOPTS': '--no-cov'} to your debug configuration. (See Debug Tests above about how to set up that launch configuration.) (For more information, see Debuggers and PyCharm in the pytest-cov documentation.)

Nose configuration settings

Setting
(python.testing.)
DefaultDescription
nosetestsEnabledfalseSpecifies whether Nose is enabled as the test framework. All other frameworks should be disabled.
nosetestPath'nosetests'Path to Nose. Use a full path if Nose is located outside the current environment.
nosetestArgs[]Arguments to pass to Nose, where each element that's separated by a space is a separate item in the list. See Nose usage options.

You can also configure nose with a .noserc or nose.cfg file as described on Nose configuration.

See also

  • Python environments - Control which Python interpreter is used for editing and debugging.
  • Settings reference - Explore the full range of Python-related settings in VS Code.