Sublime text3 and virtualenvs

I have an alternative. Just creating a new 'Build System' which runs as if in the virtual environment. Here we call it 'my_python'. The aim is to use this build system to run my script directly without leaving sublime. You need to:

  1. First, preferences->Browse Packages. This will open a folder under which lies setting files. Go inside dir User and create a new file named my_python.sublime-build (composed of the build system name followed by .sublime_build. After doing this, go to Tools -> Build System and you will see a new option my_python.
  2. Add the following JSON settings to that file.

    {
        "shell_cmd": "/Users/Ted/bsd/vector/.v_venv/bin/python -u \"$file\"",
        "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
        "selector": "source.python"
    }
    

    Inside shell_cmd, change /Users/Ted/bsd/vector/.v_venv/bin/python to the path of your python virtual environment.

  3. Then just use the short key to build your script.

When you want to change your virtual environment, just copy its path to the setting file and all done. Maybe the approach seems containing a lots of work, but it works well and convenient.


There is a sublime text3 package, named Virtualenv, allowing you to build using the Python from your virtualenv.

It supports any versions of Python in your virtualenv, and works very well for me (MacOS).

To install it, we just command+Shift+P to call out pacakge control (install it if you don't have it yet), then type install. Next type virtualenv, when you see it appears click return to install it.

After installing it, select Tools --> Build System --> Python + Virtualenv. Then you can use command + B to execute your Python projects.

Click Here to check further information.


Hopefully this is along the lines you are imagining. I attempted to simplify my solution and remove some things you likely do not need.

The advantages of this method are:

  • Single button press to launch a SublimeREPL with correct interpreter and run a file in it if desired.
  • After setting the interpreter, no changes or extra steps are necessary when switching between projects.
  • Can be easily extended to automatically pick up project specific environment variables, desired working directories, run tests, open a Django shell, etc.

Let me know if you have any questions, or if I totally missed the mark on what you're looking to do.

Set Project's Python Interpreter

  1. Open our project file for editing:

     Project -> Edit Project
    
  2. Add a new key to the project's settings that points to the desired virtualenv:

     "settings": {
         "python_interpreter": "/home/user/.virtualenvs/example/bin/python"
     }
    

A "python_interpreter" project settings key is also used by plugins like Anaconda.

Create plugin to grab this setting and launch a SublimeREPL

  1. Browse to Sublime Text's Packages directory:

    Preferences -> Browse Packages...
    
  2. Create a new python file for our plugin, something like: project_venv_repls.py

  3. Copy the following python code into this new file:

    import sublime_plugin
    
    
    class ProjectVenvReplCommand(sublime_plugin.TextCommand):
        """
        Starts a SublimeREPL, attempting to use project's specified
        python interpreter.
        """
    
        def run(self, edit, open_file='$file'):
            """Called on project_venv_repl command"""
            cmd_list = [self.get_project_interpreter(), '-i', '-u']
    
            if open_file:
                cmd_list.append(open_file)
    
            self.repl_open(cmd_list=cmd_list)
    
        def get_project_interpreter(self):
            """Return the project's specified python interpreter, if any"""
            settings = self.view.settings()
            return settings.get('python_interpreter', '/usr/bin/python')
    
        def repl_open(self, cmd_list):
            """Open a SublimeREPL using provided commands"""
            self.view.window().run_command(
                'repl_open', {
                    'encoding': 'utf8',
                    'type': 'subprocess',
                    'cmd': cmd_list,
                    'cwd': '$file_path',
                    'syntax': 'Packages/Python/Python.tmLanguage'
                }
            )
    

Set Hotkeys

  1. Open user keybind file:

     Preferences -> Key Bindings - User
    
  2. Add a few keybinds to make use of the plugin. Some examples:

    // Runs currently open file in repl
    {
        "keys": ["f5"],
        "command": "project_venv_repl"
    },
    // Runs repl without any file
    {
        "keys": ["f6"],
        "command": "project_venv_repl",
        "args": {
            "open_file": null
        }
    },
    // Runs a specific file in repl, change main.py to desired file
    {
        "keys": ["f7"],
        "command": "project_venv_repl",
        "args": {
            "open_file": "/home/user/example/main.py"
        }
    }