Sublime 配置 Python 开发环境
1. 中文文件名方框
这个是 sublime text 3 的 bug, 当 Windows 个性化显示中的设置自定义文本大小 (DPI) 大于默认的 100% 的时候, 就会出现这个bug.
解决方法:
在 sublime text 3 中, Preference, Settings - User,
最后加上一行 "dpi_scale": 1.0
覆盖操作系统设置的
DPI:
{ "color_scheme": "Packages/Nil-Theme/Sanakan.tmTheme", "font_size": 11.0, "ignored_packages": [ "Vintage" ], "update_check": false, "word_wrap": "auto", "dpi_scale":1.0 // <= 这里 }
2. 主题、字体
先安装字体, 我习惯的是 Microsoft YaHei Mono
再安装主题, Monokai Extended 和 Soda Dark, 使用 package control 就可以安装了.
然后是 sublime 的设置了, 首选项 -> 设置 - 用户
{ "auto_complete_commit_on_tab": false, "auto_find_in_selection": true, "open_files_in_new_window": false, "hot_exit": false, "remember_open_files": true, "bold_folder_labels": true, "color_scheme": "Packages/Monokai Extended/Monokai Extended.tmTheme", "theme": "Soda Dark.sublime-theme", "default_line_ending": "unix", "detect_indentation": false, "detect_slow_plugins": false, "dpi_scale": 1.0, "drag_text": false, "draw_white_space": "selection", "ensure_newline_at_eof_on_save": true, "fallback_encoding": "UTF-8", "font_face": "Microsoft YaHei Mono", "font_size": 12, "highlight_line": true, "highlight_modified_tabs": true, "ignored_packages": [ "Vintageous", "Vintage" ], "indent_guide_options": [ "draw_active", "draw_normal" ], "indent_to_bracket": true, "line_padding_bottom": 1, "line_padding_top": 1, "preview_on_click": false, "rulers": [ 120 ], "scroll_past_end": true, "shift_tab_unindent": true, "show_encoding": true, "tab_size": 4, "translate_tabs_to_spaces": true, "trim_automatic_white_space": true, "trim_trailing_white_space_on_save": true, "update_check": false, "word_wrap": true, "wrap_width": 120 }
保存重启就能看到效果了.
3. 代码提示
代码提示插件, 有 SublimeCodeIntel、Anaconda、sublimePythonIDE 以及 Jedi 等.
不过 winodows 下 SublimeCodeIntel、Anaconda、sublimePythonIDE 配置有点问题, 总不能达到预期目标, 最终选取了 Jedi.
(不过始终觉得 Anaconda 比较好…太可惜了, 装不上.. )
3.1 Jedi
Jedi 貌似现在不能通过 Package Control 来安装, 可以直接去 GitHub 上下载 https://github.com/srusskih/SublimeJEDI
下载好后, 解压文件, 重命名为 Jedi - Python autocompletion, 然后复制到 Sublime Text 3\Data\Packages 目录下.
然后再打开 sublime 插件里就有 Jedi 了.
接下来就是要配置插件的默认设置…
添加按点(dot)[.]后出现代码提示.
到 Sublime Text 3\Data\Packages\User 下添加一个文件 Python.sublime-settings (如果没有的话), 添加如下内容:
{ "auto_complete_triggers": [ { "selector": "source.python", "characters": "." } ], "auto_complete_selector": "-", }
然后, 打开 Jedi 的默认设置文件, 更改下面两条:
"python_interpreter": "D:/Python/python.exe", "python_package_paths": [ "D:/Python", "D:/Python/DLLs", "D:/Python/Lib", "D:/Python/Lib/lib-tk", "D:/Python/Lib/site-packages" ],
3.2 Anaconda
Anaconda 是一个终极 Python 插件, 它为 ST3 增添了多项 IDE 类似的功能,例如:
- Autocompletion: 自动完成,该选项默认开启,同时提供多种配置选项
- Code linting: 使用支持 pep8 标准的 PyLint 或者 PyFlakes
- McCabe code complexity checker: 让你可以在特定的文件中使用 McCabe complexity checker. 如果你对软件复杂度检查工具不太熟悉的话,请务必先浏览上边的链接
- Goto Definitions: 能够在你的整个工程中查找并且显示任意一个变量,函数,或者类的定义
- Find Usage: 能够快速的查找某个变量,函数或者类在某个特定文件中的什么地方被使用了
- Show Documentation: 能够显示一个函数或者类的说明性字符串(当然,是在定义了字符串的情况下, 目前只支持英文)
Anaconda 可以通过 Package Control 直接安装.
通常, 我的 Anaconda 配置如下:
[Preferences -> 插件设置 -> Anaconda -> Settings-User]
{ "python_interpreter": "C:/Python27/python", // 应在项目配置 "pep8_ignore": [ "E309", "E501" // 忽略长度限制 ], "auto_formatting": true, "autoformat_ignore": [ "E309", "E501" // 忽略长度限制 ], "anaconda_linter_mark_style": "none", "anaconda_linter_underlines": false, "complete_parameters": true, // 输 ( 时补充函数的非默认参数 "complete_all_parameters": false, // 输 ( 时补充函数的所有参数 "auto_python_builder_enabled": false, // 自动为当前项目生成编译系统, 通常不需要, 我们自己配置, 参照 6. 项目设置 "auto_complete_triggers": // 点(dot)\[.\]后出现代码提示 [ { "selector": "source.python - string - comment - constant.numeric", "characters": "." } ], }
4. 代码规范检查
如果上一步你能安装 3.2 Anaconda 就不需要这一步了, Anaconda 已经帮你集成好了.
pylinter 插件
这个插件依赖于 python 的 pylint 库, 所以首先,
我们得 pip install pylint
安装好后还要对 pylinter 插件做下设置
首选项 -> 插件设置 -> Pylinter -> Settings-Default
"python_bin": "D:/Python/python.exe", // The following paths will be added Pylint's Python path "python_path": [ "D:/Python", "D:/Python/DLLs", "D:/Python/Lib", "D:/Python/Lib/lib-tk", "D:/Python/Lib/site-packages" ], // Full path to the lint.py module in the pylint package "pylint_path": "D:/Python/Lib/site-packages/pylint", // Set to true to automtically run Pylint on save "run_on_save": true, // Set to true to use graphical error icons "use_icons": true, "disable_outline": true, // Status messages stay as long as cursor is on an error line "message_stay": true,
5. 自动生成注释
DocBlockr 插件
在 Python 文件中, 文件头、类头以及函数头输入 “”” 再按回车即可, 例如:
class TestClass(): """ <-- Press [enter] def test_function(): """ <-- Press [enter]
6. 项目设置
由於 Python 可以透過 virtualenv 來設定不同的虛擬環境, 透過這些環境來對不同開發專案, 達到環境獨立的優點, 因此我們也會期望在使用 sublime 開發時, 也可以偵測到不同的環境. 首先先用 sublime 创建一个项目, 很简单, 直接 项目 -> 项目另存为 就可以了.
保存好后选择 项目 -> 编辑项目, 设置使用 virtualenv 环境:
2018.06.26 update for mac, python3.6
// mac, python3.6 { "build_systems": [ { "cmd": [ "${project_path}/venv/bin/python", "-i", "-u", "-m", "${project_base_name}.${file_base_name}" ], "encoding":"cp936", // 仅 windows 下需要,否则会输出 Decode error - output not utf-8 "env": { "LANG": "de_DE.utf-8", "LC_ALL": "de_DE.utf-8" }, "name": "project_venv builder", "selector": "source.python", "working_dir": "${project_path:${folder}}" // project_path == nil 时取 folder } ], "folders": [ { "path": ".", "follow_symlinks": true } ], "settings": { "python_interpreter": "${project_path}/venv/bin/python" } } // window, python2.7 { "build_systems": [ // 添加 [Tools / Build System] { "name": "project_venv builder", "selector": "source.python", "shell_cmd": "D:/pydj/project_venv/Scripts/python -u \"$file\"" } ], "folders": [ { "follow_symlinks": true, "path": "." } ] }
然后是覆盖 Jedi 默认设置中的 python_interpreter 和 python_package_paths (如果你安装了 Jedi 的话):
// window, python2.7 { "build_systems": [ { "name": "project_venv builder", "selector": "source.python", "shell_cmd": "D:/pydj/project_venv/Scripts/python -u \"$file\"" } ], "folders": [ { "follow_symlinks": true, "path": "." } ], "settings": { "python_interpreter": "D:/pydj/project_venv/Scripts/python.exe", "python_package_paths": [ "D:/pydj/project_venv/Scripts", "D:/pydj/project_venv/Lib", "D:/pydj/project_venv/Lib/site-packages" ], } }
另外是覆盖 pylinter 的设置 (如果使用的是
pylinter 的话, 另外, virtualenv 里也需要
pip install pylint
):
// window, python2.7 { "build_systems": [ { "name": "project_venv builder", "selector": "source.python", "shell_cmd": "D:/pydj/project_venv/Scripts/python -u \"$file\"" } ], "folders": [ { "follow_symlinks": true, "path": "." } ], "settings": { "python_interpreter": "D:/pydj/project_venv/Scripts/python.exe", "python_package_paths": [ "D:/pydj/project_venv/Scripts", "D:/pydj/project_venv/Lib", "D:/pydj/project_venv/Lib/site-packages" ], "pylinter": { "python_bin": "D:/pydj/project_venv/Scripts/python.exe", "python_path": [ "D:/pydj/project_venv/Scripts", "D:/pydj/project_venv/Lib", "D:/pydj/project_venv/Lib/site-packages" ], } } }
7. 侧边栏扩展
SideBarEnhancements 插件
安装好,
view -> Side Bar -> Hide Open Files
,
其它的几乎不需要设置, 当打开__项目__时,
在项目文件上右键就能显示扩展.
如果安装好 SideBarEnhancements 后没有显示侧边栏, 可以用快捷键 ctrl + k, ctrl + b 来打开侧边栏 (不是 ctrl + k + b, 是先按 ctrl + k, 松开再按 ctrl + b), 或者点击菜单: 查看 -> 侧边栏 -> 显示\隐藏侧边栏
8. 代码调试
SublimeREPL 插件
这个插件允许在编辑界面直接运行 Python 解释器
8.1 SublimeREPL 基础
这部分内容仅做了解, 可直接用 [8.2 更好的 SulimeREPL 设置] 替代.
8.1.1 添加 virtualenv 支持
打开 SublimeREPL 的用户设置: 首选项 -> 插件设置 -> SulimeREPL -> Setting-User.
{ "python_virtualenv_paths": [ "D:/pydj" ] }
在这里写入 virtualenv 项目的根目录路径, 如我的 virtualenv
项目路径是 D:/pydj/project_venv
, 所以这里填入
D:/pdj
当需要运行 virtualenv 时, 选择 Python - virtualenv 后, 界面上会出现 virtualenv 选择框:
选择后就能打开该 virtualenv 的 python 交互解释器了.
8.1.2 以交互式运行当前文件
SublimeREPL 里最常用的应该就是 Python 和 Python - RUN current file, 前者是打开交互式环境, 后者是直接运行当前文件, 但是一些常见的 python ide 都是把这两者结合起来, SublimeREPL 通过设置也能实现这个功能.
打开 Sublime Text 3\Packages\SublimeREPL\config\Python\Main.sublime-menu 文件 (先备份一份).
删除 “id” 为 “repl_python” 的项(如果想保留也可以不删除), 修改 “id” 为 “repl_python_run” 的项:
[ { "id": "tools", "children":[ { "caption": "SublimeREPL", "mnemonic": "r", "id": "SublimeREPL", "children": [ { "caption": "Python", "id": "Python", "children": [ { "command": "repl_open", "caption": "Python", "id": "repl_python", // <= 这里 "mnemonic": "p", "args": { "type": "subprocess", "encoding": "utf8", "cmd": ["python", "-i", "-u"], "cwd": "$file_path", "syntax": "Packages/Python/Python.tmLanguage", "external_id": "python", "extend_env": {"PYTHONIOENCODING": "utf-8"} } }, { "command": "repl_open", "caption": "Python - RUN current file", "id": "repl_python_run", // <= 这里 "mnemonic": "d", "args": { "type": "subprocess", "encoding": "utf8", "cmd": ["python", "-i", "-u", "$file_basename"], "cwd": "$file_path", "syntax": "Packages/Python/Python.tmLanguage", "external_id": "python", "extend_env": {"PYTHONIOENCODING": "utf-8"} } }, { "command": "repl_open", "caption": "Python - PDB current file", "id": "repl_python_pdb", "mnemonic": "d", "args": { "type": "subprocess", "encoding": "utf8", "cmd": ["python", "-i", "-u", "-m", "pdb", "$file_basename"], "cwd": "$file_path", "syntax": "Packages/Python/Python.tmLanguage", "external_id": "python", "extend_env": {"PYTHONIOENCODING": "utf-8"} } }, { "command": "python_virtualenv_repl", "id": "python_virtualenv_repl", "caption": "Python - virtualenv" }, { "command": "repl_open", "caption": "Python - IPython", "id": "repl_python_ipython", "mnemonic": "p", "args": { "type": "subprocess", "encoding": "utf8", "autocomplete_server": true, "cmd": { "osx": ["python", "-u", "${packages}/SublimeREPL/config/Python/ipy_repl.py"], "linux": ["python", "-u", "${packages}/SublimeREPL/config/Python/ipy_repl.py"], "windows": ["python", "-u", "${packages}/SublimeREPL/config/Python/ipy_repl.py"] }, "cwd": "$file_path", "syntax": "Packages/Python/Python.tmLanguage", "external_id": "python", "extend_env": { "PYTHONIOENCODING": "utf-8", "SUBLIMEREPL_EDITOR": "$editor" } } } ] } ] } ] } ]
补充下: ipython 是一个 python 的交互式 shell, 比默认的 python shell 好用得多, 支持变量自动补全, 自动缩进, 支持 bash shell 命令, 内置了许多很有用的功能和函数. 不过 SublimeREPL 的 ipython 不怎么好用, 所以一般也不用…
8.1.3 关联快捷键
首选项 -> 按键绑定 - 用户
[ { "keys": ["f5"], "command": "run_existing_window_command", "args": { "id": "repl_python_run", "file": "config/Python/Main.sublime-menu" } }, ]
8.2 更好的 SulimeREPL 设置
在 stackoverflow 上找到一个解决方案 http://stackoverflow.com/questions/24963030/sublime-text3-and-virtualenvs
该方案有很好兼容性, 完全可以替代上面的所有设置, 设置好后, 通过快捷键来触发 SublimeREPL, 并且以后切换 virtualenv 时, 只需要设置项目设置中的 python_interpreter 就可以了.
首选项 -> 浏览插件, 创建一个 py 文件:
project_venv_repl.py
2018.06.26 update for mac, python3.6
# mac, python3.6 import os import sublime import sublime_plugin def expand(view, path): """Expand the given path """ window = view.window() if window is not None: tmp = sublime.expand_variables(path, window.extract_variables()) tmp = os.path.expanduser(os.path.expandvars(tmp)) else: return path return tmp class ProjectVenvReplCommand(sublime_plugin.TextCommand): """ Starts a SublimeREPL, attempting to use project"s specified python interpreter. """ def run(self, edit, no_file=False): """Called on project_venv_repl command""" cmd_list = [self.get_project_interpreter(), "-i", "-u"] if not no_file: file = "{}.{}".format(self.get_variable("project_base_name"), self.get_variable("file_base_name")) cmd_list.append("-m") cmd_list.append(file) self.repl_open(cmd_list=cmd_list) def get_variable(self, key): return self.view.window().extract_variables()[key] def get_project_interpreter(self): """Return the project"s specified python interpreter, if any""" settings = self.view.settings() return expand(self.view, settings.get("python_interpreter", "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": self.get_variable("project_path"), "syntax": "Packages/Python/Python.tmLanguage", "extend_env": { "LANG": "de_DE.utf-8", "LC_ALL": "de_DE.utf-8" }, } ) # windows, python2.7 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', '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' } )
首选项 -> 按键绑定 - 用户
2018.06.26 update for mac, python3.6
// mac, python3.6 [ // Runs currently open file in repl { "keys":[ "super+b" ], "command":"project_venv_repl" }, // Runs repl without any file { "keys":[ "super+shift+b" ], "command":"project_venv_repl", "args":{ "no_file":true } } ] // windows, python2.7 [ // 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" } } ]
- f5: 以项目设置中的 python_interpreter 来运行当前文件
- f6: 直接运行项目设置中的 python_interpreter
- f7: 以项目设置中的 python_interpreter 来运行指定 py 文件, 更新 open_file 就可以了.
9. outline
Outline 插件
安装好后, 打开它的配置文件:
{ "color_scheme": "Packages/Outline/outline-Dark.hidden-tmTheme" }
10. 编译 Pyc 文件
10.1 生成单个的 pyc 文件
import py_compile py_compile.compile(r'H:/game/test.py')
执行上面的代码, 就能将 test.py 生成 test.pyc 了.
10.2 将整个目录下的 py 文件都生成 pyc
import compileall compileall.compile_dir(r'H:/game')
执行上面的代码, 就将 game 目录下的所有 py 文件(包含子目录)都生成 pyc 文件了.
当编写项目时, 可以把这个功能做到 [工具 -> 编译系统] 里或者 [SublimeREPL] 里:
{ "selector": "source.python", "shell_cmd": "python -m py_compile \"test.py\"" } { "selector": "source.python", "shell_cmd": "python -m compileall \"C:/Users/Administrator/Desktop/Scripts\"" }