启动Anaconda并运行对应Python脚本
事因
Python是一个非常方便的脚本语言,因此本人会经常使用到Python做一些事情。由于PyCharm太大,因此本人安装了Sublime Text 3。在Sublime安装了一些Anaconda插件和可运行插件后,尝试run了一下,发现一些Python库提示版本错误等问题;但是Anaconda终端控制台运行同一个脚本却不会报错。
简介
Sublime Text 3是支持自定义Command的,在Sublime Text 3安装目录中可以找到Sublime Text 3/Lib/Python38
,里面有两个脚本sublime.py
和sublime_plugin.py
。查看两个文件的源代码,发现其中sublime_plugin.py
依赖sublime.py
。
Plugin
Q:自定义Command如何创建呢?
A:Sublime工具栏中找到tools -> Developer -> new Plugin..
,将文件保存在Sublime Text 3/Packages/User
目录下。
默认创建的Plugin代码如下:
import sublime
import sublime_plugin
class ExampleCommand(sublime_plugin.TextCommand):
def run(self, edit):
self.view.insert(edit, 0, "Hello, World!")
Q:如何验证编写的Command代码是正确的?
A:在Sublime中使用 ctrl+` 可以打开Console
,输入view.run_command("example")
即可执行ExampleCommand脚本。
Q:view.run_command(commandStr)
中的commandStr
是根据什么样的规则来的?
A:AaaBbbCommand类的commandStr为aaa_bbb,aaaBbbCommand类的commandStr为aaa_bbb。
Q:该如何设置快捷键来运行自定义的Command?
A:Sublime中找到Perferences -> Key Buildings
,在右边窗口中输入格式如{ "key" : ["快捷键"], "command" : "自定义命令" }
的Json内容。
启动Anaconda并运行对应Python脚本
创建Plugin脚本文件
Sublime工具栏中找到tools -> Developer -> new Plugin..
,将下面两个脚本文件保存在Sublime Text 3/Packages/User
目录下。
autoOpenCommand脚本
import os
import sublime
import sublime_plugin
class autoOpenCommand(sublime_plugin.TextCommand):
def run(self, edit):
# 获取当前选中文件的路径
filepath = self.view.file_name()
# 创建cmd命令
commands = []
# 进入Anaconda脚本目录
commands.append(r'cd C:\Users\xxx\Anaconda3\Scripts')
# 激活Anaconda环境
commands.append(r'activate.bat')
# 进入autoOpenCommand脚本所在目录
commands.append(r'cd ' + os.path.abspath(os.path.dirname(__file__)))
# 运行另外一个python程序: python autoOpen.py arg1
commands.append(r'python autoOpen.py ' + filepath)
# 制作成1行命令
command = ""
for i in range(len(commands)):
command = command + commands[i] + (" & " if i != len(commands)-1 else "")
# 开启cmd并且运行command
command = r'%windir%\System32\cmd.exe /c "{0}"'.format(command)
os.system(command)
autoOpen脚本
import os
import sys
import multiprocessing
if __name__ == "__main__":
# 获取命令行输入参数
if len(sys.argv) <= 1:
exit(0)
# 由于传入的文件可能包含空格, 因此需要进行拼接
filepath = ""
for i in range(len(sys.argv)):
if i == 0:
continue
filepath = filepath + " " + sys.argv[i]
# 分隔目录和文件名
index = filepath.rfind('\\')
# 命令
commands = []
# 进入Anaconda脚本目录
commands.append(r'cd C:\Users\xxx\Anaconda3\Scripts')
# 激活Anaconda环境
commands.append(r'activate.bat')
# 进入Sublime选中脚本所在目录
commands.append(r'cd ' + filepath[:index])
# 运行脚本
commands.append(r'python ' + filepath[index+1:])
# 制作成1行命令
command = ""
for i in range(len(commands)):
command = command + commands[i] + (" & " if i != len(commands)-1 else "")
command = r'%windir%\System32\cmd.exe /K "{0}"'.format(command)
# 开启一个进程
p = multiprocessing.Process(target=os.system, args=(command,))
p.start()
设置Key Buildings
Sublime中找到Perferences -> Key Buildings
。
[
{ "keys": ["f5"], "command": "auto_open" },
]
测试
编写脚本,按F5执行即可。
遇到的问题
由于Sublime是交互式运行的,因此不能直接开启一个进程。autoOpenCommand类有一个错误,os.system(command)
运行后并不会马上结束,意味着Sublime将卡住,除非关闭Anaconda控制台。
临时解决方案
将autoOpenCommand脚本中的os.system(command)
改为threading.Thread(target=os.system, args=(command,)).start()
。
import os
import threading
import sublime
import sublime_plugin
class autoOpenCommand(sublime_plugin.TextCommand):
def run(self, edit):
# 获取当前选中文件的路径
filepath = self.view.file_name()
# 创建cmd命令
commands = []
# 进入Anaconda脚本目录
commands.append(r'cd C:\Users\zengzhiwen.pinkz\Anaconda3\Scripts')
# 激活Anaconda环境
commands.append(r'activate.bat')
# 进入autoOpenCommand脚本所在目录
commands.append(r'cd ' + os.path.abspath(os.path.dirname(__file__)))
# 运行另外一个python程序: python autoOpen.py arg1
commands.append(r'python autoOpen.py ' + filepath)
# 制作成1行命令
command = ""
for i in range(len(commands)):
command = command + commands[i] + (" & " if i != len(commands)-1 else "")
# 开启cmd并且运行command
command = r'%windir%\System32\cmd.exe /c "{0}"'.format(command)
threading.Thread(target=os.system, args=(command,)).start()