Sublime插件开发 启动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.pysublime_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()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值