I'm trying to get autocompletion working in Sublime Text 3 via the Anaconda plug-in. So far I've been successful getting autocompletion working with the standard python libraries but not for Django.
My sublime project file looks like this:
{
"folders": [
{
"follow_symlinks": true,
"path": "."
}
],
"settings": {
"python_interpreter": "/Users/user/.virtualenvs/project/bin/python",
"suppress_word_completions": true,
"extra_paths":
[
"/Users/user/.virtualenvs/project/lib/python2.7/site-packages"
],
"anaconda_debug": true,
},
"build_systems":
[
{
"name":"Virtualenv 2.7 Project",
"shell_cmd": "/Users/user/.virtualenvs/project/bin/python -u \"$file\"",
"path": "/Users/jamiehush/.virtualenvs/project/bin",
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}
]
}
I'm also running "subl" from a terminal while inside a virtual environment.
You shouldn't need any special extra_path to make autocompleting work with Django. Nothing make Django special, anaconda should be able to autocomplete whatever is visible by your configured python interpreter.
Make sure that the virtual environment in project has a copy of Django installed on it. If you have virtualenwrapper installed should be as easy as:
$ workon project
$ python
import django
If you have Django in your virtualenv, is possible that the anaconda JsonServer was started before you installed the library and it's not able to see it. Restart your Sublime Text 3 and try again.
In case that you still have problems, send an email to the anaconda's mailing list or open an issue in the Github project (https://github.com/DamnWidget/anaconda/issues) indicating your operating system, ST3 build and Python version that you are using so we can help you further.
Related
Okay, I've looked through a bunch of python venv with sublime text questions, and I'm pretty sure this issue is due to the specifics of venv on windows.
I'm on Windows, using Python 3.10, and the virtualenv package to manage my virtual environments.
I'm trying to set up a custom build in a Sublime project file that does the following:
activate the venv for the local project
echos the VIRTUAL_ENV to the shell to show the correct venv has been activated
I've been having issues with getting both into one build command, so here's the current array with the two steps as seperate builds:
"build_systems":
[
{
"name": "activate",
"cmd": "$project_path/venv/Scripts/activate.bat",
"shell": true
},
{
"name": "Current VENV?",
"cmd": "echo %VIRTUAL_ENV%",
"shell": true
},
]
Currently, when I run the activate build, I get the following:
The system cannot find the path specified.
[Finished in 80ms with exit code 1]
[cmd: C:\Users\kreeh\Repos\project/venv/Scripts/activate.bat]
[dir: C:\Users\kreeh\Repos\project]
If I run C:\Users\kreeh\Repos\project/venv/Scripts/activate.bat in a separate cmd.exe window, it correctly activates the venv, and when I print the %VIRTUAL_ENV% var, it correctly returns the venv location.
C:\Users\kreeh>C:\Users\kreeh\Repos\project/venv/Scripts/activate.bat
(venv) C:\Users\kreeh>echo %VIRTUAL_ENV%
C:\Users\kreeh\Repos\project\venv
I assume this is an issue with how the Sublime Text build system is handling the windows path formatting. If I try and utilize the working directory param, it doesn't work, because the cmd.exe doesn't do relative paths nicely.
{
"name": "activate",
"cmd": "venv/Scripts/activate.bat",
"working_dir": "${project_path}",
"shell": true
},
returns
'venv' is not recognized as an internal or external command,
operable program or batch file.
[Finished in 60ms]
So, is there a way to have the Sublime Build system handle the windows path correctly, or is there a way to use a relative path in the cmd?
#MattDMo pointed out the flaw in my logic, which is that the venv activation doesn't actually do anything in and of itself -- it changes the python interpreter used for future commands in that prompt window. As such, it's kind of a useless thing for a build system. Instead, I added a venv-specific pip install and build commands so far.
{
"build_systems":
[
{
"name": "pip install",
"cmd": "${project_path}/venv/Scripts/pip3.exe install -r requirements.txt ",
"working_dir": "${project_path}",
"shell": true
},
{
"name": "VENV Build",
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python",
"cmd": "${project_path}/venv/Scripts/python.exe $file",
"shell": true,
},
],
"folders":
[
{
"follow_symlinks": true,
"path": "."
}
],
One thing to note, as a Windows user, I had to add the follow_symlinks=true to the folders list -- this is because the way venv works on windows (or at least on MY install), there's not an actual python.exe in that venv folder, it's a symlink.
I have the different virtualenv's and to be able to specify which virtualenv to use with each project I used package Virtualenv (https://packagecontrol.io/packages/Virtualenv) in Sublime Text 3. That was so to the day when through the update I became the owner of the Sublime Text 4. The package Virtualenv stopped working (it can be use only with Sublime Text 3).
I manage now the virtualenv's in Sublime Text 4 in the other way. I use the virtualenv through Tools/Build System. I run my script directly without leaving Sublime like with package Virtualenv. To build the new Build System for the existing virtualenv I first run Tools/Build System/New Build System and in the newly opened file I paste:
{
"shell_cmd": "C://python_projects/my_project/env/Scripts/python -u \"$file\"",
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}
after this I save it under the name of the project (here my_project_python) in the dir User. It create a new file named my_project_python.sublime-build (composed of the build system name followed by .sublime_build). After doing this, I go to Tools -> Build System and I can see a new option my_project_python. The different virtualenv's only differ in the path C://python_projects/my_project/env/Scripts/python and names of the file .sublime-build.
That's nice but when we have a big number of folders with different virtualenv's this can be a bit frustrating to have so many names in Tools -> Build System. I think that the package Virtualenv manage the virtualenv's with more grace.
So I would like to ask the community if there is another package like Virtualenv that can work in Sublime Text 4? Maybe someone has some way to run the package Virtualenv in Sublime Text 4?
There is a package Virtualenv for ST3, you can downgrade. Currently it doesn't work with ST4 (issue).
You can specify build system per project:
Create sublime project or add existing directory to sublime project
Goto Project -> Edit Project
Add this and save in root of you project:
{
"build_systems":
[
{
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", # highlight line on error
"name": "<proj-name>",
"selector": "source.python",
"shell_cmd": "/path/to/virtualenv/.venv/bin/python -u \"$file\""
},
],
"folders":
[
{
"path": "."
},
],
}
If you don't want to store .sublime-project files in project's root dir, specify full path to project's root dir in: "path": "/path/to/proj"
Still, you need to chose build system before running scripts. In this case it'll be <proj-name>
You can generate this config programmatically.
More options for Project config here.
If you find something flexible for venvs, hit me up)
There is a build system variable $folder which gives the path to the top level folder open in the sidebar. If you specify a working directory in the project file this will be the project folder.
Add the path to your project file:
{
"folders":
[
{
"name": "ProjectName",
"path": "/path/to/your/project"
}
]
Then create a file Py3Venv.sublime-build:
{
"cmd": ["$folder/.venv/bin/python", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python",
"encoding": "utf8",
}
This file needs to be placed in User subfolder of the Sublime packages directory. Easiest way to find is "Preferences > Browse Packages" (macOS, ymmv).
ProjectManager plugin stores project files in SublimeText settings folder, rather than the project folder. Worth checking if you don't already use.
Basically, I've installed Sublime Text 2 to write in Python.
I then installed Package control and via package control I search "SublimeREPL" and I install the package, however even after installing, when I select Python through Tools > SublimeREPL > Python > Python, I get the error:
WindowsError(2, 'The system cannot find the file specified.')
Any help please? I'm pretty new to this.
Go to preferences -> Keybindings - User
and paste this. Make sure there are only one set of [] in your file, if you have custom keybinds set already then add a , after your last } then paste everything but the [] at the beginning and end after your ,.
[
{ "keys": ["ctrl+shift+r"], "command": "repl_open",
"caption": "Python",
"mnemonic": "p",
"args": {
"type": "subprocess",
"encoding": "utf8",
"cmd": ["python", "-i", "-u","$file"],
"cwd": "$file_path",
"syntax": "Packages/Python/Python.tmLanguage",
"external_id": "python"
}
}
]
Save and quit Sublime Text.
Follow these instructions
How to add to the pythonpath in windows 7?
You should now be able to run your current file in repl with crtl+shift+r
Open sublime text and create a new file. Save it as hello.py
Type:
print('Hello World')
Save then hit ctrl-shift-r
See if that works
I am able to set python3.2 for the build command in sublime text 2(and build with python3.2), but when invoking the console with cmd-` the interpreter is mac's default 2.6 version.
Any help is greatly appreciated!
The console in Sublime Text 2 uses the internal version of Python, which is 2.6. There is no way to change it without breaking a whole bunch of stuff. There is a workaround, though. If you just want a Python console within ST2, use the awesome SublimeREPL package, which can also be installed through Package Control. Among many other things, you can send selections or whole files to be interpreted through a REPL of your choice, including Python 3. Create Packages/User/SublimeREPL/config/Python/Main.sublime-menu with the following contents:
[
{
"id": "tools",
"children":
[{
"caption": "SublimeREPL",
"mnemonic": "r",
"id": "SublimeREPL",
"children":
[
{"caption": "Python",
"id": "Python",
"children":[
{"command": "repl_open",
"caption": "Python 3",
"id": "repl_python3",
"mnemonic": "p",
"args": {
"type": "subprocess",
"encoding": "utf8",
"cmd": ["python3", "-i", "-u"],
"cwd": "$file_path",
"syntax": "Packages/Python/Python.tmLanguage",
"external_id": "python",
"extend_env": {"PYTHONIOENCODING": "utf-8"}
}
}
]
}
]
}]
}
]
changing the "cmd" option to the full path to your python3 binary. This way your changes will survive any SublimeREPL upgrades. BTW, this path works for any package, so you can feel free to customize away without fear of accidentally losing it all.
Cmd+` is supposed to open Sublime Text's embedded interpreter console, i.e. the one that you use when developing or debugging Sublime plug-ins. You can verify that by noticing that the sublime module is available.
If you really want Python 3 console there, upgrade to Sublime Text 3 which embeds Python 3.3. Alternatively, use a dedicated plug-in like SublimeREPL (see #MattDMo's answer).
And BTW: If you want a nice environment for interactive Python work, I suggest to disregard the above and give IPython Notebook a shot.
You could try setting the environment variables something similar to the following in Tools > Build System > New Build System
{
"path": "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin",
"env":
{
"PYTHONPATH":"/usr/local/lib/python:/usr/local/username/python/3.2/lib/python3.2/"
},//this comma!
"cmd": ["python3", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}
What you're seeing is the Python that comes bundled with Sublime Text. I wouldn't upgrade it, but if you want to use your own you could do something like:
ln -s $HOME/.pythonbrew/pythons/Python-2.6/lib/python2.6 /Your_Sublime_Install_Path/lib/python2.6
I am using sublime text 2 for python development along with virtualenv!
The standard sublime text 2 build system uses the standard python install rather than my virtualenv where my packages are installed.
How can I get sublime text 2 to build using my virtualenv?
I currently use the terminal to activate my environment and run my scripts.
UPDATE: Never got it working, but seeing as i am using flask and it builds when you make a change, it's not a big issue
You can also set the path for the build system to the bin directory of your virtualenv, like so:
"build_systems":
[
{
"selector": "source.python",
"env": {"PYTHONPATH":"/Users/user/project"},
"path":"/Users/user/work/myvirtualenv/bin:$PATH",
"name": "Run virtualenv python",
"cmd": ["python", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"variants": [
{ "name": "Run all Tests",
"working_dir": "/Users/user/project",
"cmd": ["nosetests"]
}
]
}
]
This also allows other tools, like nose in the example, to find the correct python binary from the virtualenv.
In windows this works for me:
"build_systems":
[
{
"name": "Run Tests",
"working_dir": "/path/to/to/your/django_project",
"cmd": ["/path/to/your/virtualenv/bin/python.exe", "manage.py", "test"]
}
]
Sublime's Build System supports variables which can be used with Sublime project files to make this a bit more portable across projects.
If your virtual environments are in a standard spot, create a new project file (Project -> Save Project As) into the root directory of your project just above your virtual environment directory. Then create a new build file with something like this:
{
"cmd": ["$project_path/venv/bin/python", "-u", "$file"]
}
It seems to then pick up the rest automatically - the same as if you typed ./venv/bin/python from the command line - no need to mess with paths, environment variables, etc.
I'm using Flask, but I think it's apply to nearly every case.
My actual build is like this, where "benicio" is the directory of my project:
{
"cmd": ["source ~/projs/benicio/venv/bin/activate && python ~/projs/benicio/benicio_tests.py"],
"shell": true
}
Sorry to add yet another answer to this - but this caused me a large amount of grief figuring this out.
Not only do you need to make a build system like:
"build_systems":
[
{
"name": "Maths",
"env": {"PYTHONPATH":"/home/nebffa/Desktop"},
"path":"$project_path/bin",
"cmd": ["$project_path/bin/python3.3", "-u", "$file"]
}
]
but you HAVE to change a setting in Sublime Text - go to Tools --> Build System --> "Maths". In my case I need to choose "Maths" because that's what I named my build system. If you don't do this - Sublime Text does not use your build system!!
I have just got sublime text 3 to working in a virtualenv. Although the OP specified ST2, there all likely more like myself who are using ST3. Thanks to user1248490 and Russell Beattie I arrived at the following:
{
"shell_cmd": "$project_path/vi_sys_pkgs/bin/python3 -u \"$file\"",
"path": "$project_path/vi_sys_pkgs/bin",
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}
Note that "cmd" is now "shell_cmd" in ST3. See ST3 blog
Under MAC OSX, this works for me
{
"cmd": ["/your/virtualenv/bin/python", "-u", "$file"]
}
What i did was keep it simple:
Went to root drive and created python folder:
sudo mkdir python
then went in there and created the virtualenv
virtualenv --no-site-packages virtualenvname
then created a newbuild in ST2 with the above command and it works
This is what I have as a build system (assuming my virtualenv is created as a folder called 'env' in my current project directory). This at least means I don't need to constantly change the build system between projects:
{
"cmd": ["env/bin/python", "-u", "$file"]
}
I saved this as a New Build System (Tools -> Build System -> New Build System).
I use this to build my Flask project. I have added the following code to my Project Settings: Project -> Edit Project
{
"folders":
[
{
"path": "/C/MyDev/chilinzb/"
}
],
"build_systems":
[
{
"name": "Flask",
// activate the specific virtualenv for the project
"cmd": ["C:/MyDev/virtualenvs/env_chilinzb/Scripts/python", "$file"]
}
]
}
and then I just switch to my run.py file and hit Ctrl+B
this combination worked great:2 steps
1) add the 2 appropriate keys to the 'env' key.
A) DJANGO_SETTINGS_MODULE
B) PYTHONPATH
2) update cmd to reflect the version of python you want to use.
{
"env":{"DJANGO_SETTINGS_MODULE":"my_project.settings",
"PYTHONPATH":"d:\\Projects\\virts\\my_project\\Scripts;d:\\Projects\\virts\\my_project\\Lib;d:\\Projects\\virts\\my_project\\Lib\\site-packages;D:\\Projects\\my_project"
},
"cmd": ["c:/Python27/python.exe","$file"]
}
I have an answer for anyone who uses Heroku and uses their foreman tool, and it works great. Simply create a new build system like so:
{
"cmd": ["foreman", "run", "python", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}
This pulls in all of the environment variables available to Foreman, including your virtualenv's $PATH variable, which adds the virtualenv Python to your python path.
source did not work for me inside the build on lubuntu.
use '.' or dot instead of 'source'.
this did work:
{
"env": {
"DJANGO_SETTINGS_MODULE":"django_project_name.settings",
"PYTHONPATH":"/home/my_username/current/django_project_name:/home/my_username/.virtualenvs/django_project_name/lib/python2.7:/home/my_username/.virtualenvs/django_project_name/lib/python2.7/site-packages/"
},
"working_dir":"$project_path",
"cmd":[". /home/my_username/.virtualenvs/django_project_name/bin/activate && python $file"],
"shell":true
}
this worked for me:
{
"cmd": ["C:/Users/user/virtualenvs/env1/Scripts/python.exe", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}
saved build in:
"C:\Users\user\AppData\Roaming\Sublime Text 2\Packages\User\"
as
"Python_env1.sublime-build"
Select
Tools> Build System> Python_env1
done!
using windows 8.1, st2
Assuming you keep your project-specific virtualenv in an .env-folder on the top level of your project.
Sublime > Project > Save project as... (if you haven't already. This will allow you to set custom build options for the project
Project > Edit Project:
{
"folders":[
{
"path": ".",
"folder_exclude_patterns": [".env"],
}
],
"build_systems":[
{
"name": "Run in VirtualEnv",
"shell_cmd": "source $project_path/.env/bin/activate && python -u $file"
}
]
}
Tools > Build System > Run in VirtualEnv
Tools > Build
Please note that this was tested with Sublime Text 3.
Note comments about this solution being incorrect.
You have to edit your sublime-project file and add the following:
"build_systems":
[
{
"name": "Run Tests",
"cmd": ["source", "/path/to/your/virtualenv/bin/activate"],
"working_dir": "/path/to/to/you/django_project",
"cmd": ["python", "manage.py", "test"]
}
]