作一个运行Python文件的Atom插件

最近在学习Python,天然也安装了Atom编辑器的一些Python插件。有一个插件名字叫作atom-python-run,做用很简单,就是按F5运行当前Python文件。不过这个插件有一个问题,就是只能在Windows平台上以cmd方式运行。我但愿这个插件能支持Powershell方式运行,因此我就给做者提了Issue。结果发现Issue还很多。而做者正比如较忙,目前没工夫。因此我就想,为何不本身作一个Atom插件呢?python

以上就是我开发这个插件的目的了。这个插件的主要功能就是按F5启动一个终端运行Python文件,终端能够是cmd也能够是powershell。git

编写插件

这个插件我就叫它run-python-simply,听名字应该就能猜出它的做用。首先打开Atom编辑器,而后点击菜单栏Packages->Package Generator->Generate Package,输入要建立的插件名字,而后按回车。github

时间统计

在编写插件以前,咱们首先分析一下插件的需求。因为atom-python-run这个插件有CodeBlocks式的程序返回值和运行时间的显示,我但愿个人插件也具备这个功能。看了一下atom-python-run的源代码,做者的实现方式是写一个C++程序,用这个C++程序调用Python文件,时间统计在C++程序中。我这里就不使用C++了,既然是Python的插件,那么我这里就使用Python来统计时间。shell

下面的脚本很简单,要执行的文件经过命令行参数传入。程序返回的结果附带时间统计和返回值的,这个和atom-python-run插件的输出结果相同。json

# Python 3 file

import subprocess
import time
import sys

script = sys.argv[1]

start = time.time()
process = subprocess.run(['python', script], stderr=subprocess.STDOUT)
exitcode = process.returncode


end = time.time()

seconds = end - start

print()
print(
    f'Process return {exitcode} ({hex(exitcode)})   execution time: {seconds:.03f} s')
subprocess.call("pause", shell=True)

主要代码

插件的主要代码我使用了CoffeeScript编写。默认自动生成的代码有两个,一个视图,另外一个是代码。因为咱们这个插件不须要显示什么内容,因此那个View文件直接删了就行。剩下一个文件写成下面这样。浏览器

这个文件的实现参考了atom-python-run。因为我也是刚刚学习编写插件,对于插件怎么写仍是不太懂,因此最简单的办法就是参考另外一个插件了。固然即便是参考,过程也是很痛苦的。由于我毕竟对JavaScript和CoffeeScript不太熟悉,有些简单的地方也浪费了很多时间。并且插件的调试也不太方便,须要开两个Atom窗口,一个修改完以后,重载另外一个。编辑器

写完以后再看看代码,并不怎么难。因为代码时间的统计已经作Python文件中作好了,因此在这里只须要调用那个Python,让Python调用实际的Python文件就好了。学习

这里用到的知识点有NodeJS的pathchild_process模块。具体用法看NodeJS文档就行了。还有就是几个Atom接口的使用:notifications用来建立通知,就是右上角的气泡通知;atom.config用来获取Atom的配置项;config节点用来添加插件的配置。具体使用到时不难,看Atom的文档就好了。ui

{CompositeDisposable} = require 'atom'
child_process = require 'child_process'
path = require 'path'

module.exports = RunPythonSimply =
  subscriptions: null
  activate: (state) ->
    @subscriptions = new CompositeDisposable
    @subscriptions.add atom.commands.add 'atom-workspace', 'run-python-simply:toggle': => @toggle()

  deactivate: ->
    @subscriptions.dispose()

  serialize: ->


  toggle: ->
    editor = atom.workspace.getActiveTextEditor()
    if editor
      file = editor.buffer.file
      if file
        fileInfo = path.parse(file.path)
        if fileInfo.ext != ".py"
          atom.notifications.add("warning", "Current file is not a python source file")
        else
          editor.save()
          @run(file.path)
      else
        atom.notifications.add("info", "No source file to run")

  run: (file)->
    command = atom.config.get('run-python-simply.command')
    args = command.split(" ").concat(['python', __dirname + path.sep + 'exec.py', file])
    process = child_process.spawn("start", args, {
      shell: true
      detached: true
    })
    process.unref()

  config:
    command:
      title: "Command Prompt"
      type: 'string'
      default: 'cmd /c'
      enum: [
        {value: 'cmd /c', description: 'Command Line Prompt'}
        {value: 'powershell -command', description: 'Powershell'}
      ]

其实Atom的插件系统比我想的要简单。一开始我以为Atom插件要作的事情其实还挺多,还要本身管理本身的配置对话框。后来我发现根本不须要,Atom的系统比较智能。就像上面代码中的那样,只要咱们在代码中声明了一个config元素,编辑器就会自动生成对应的配置界面。比方说上面我声明了两个enum,编辑器那么编辑器就自动生成了下拉列表。atom

下拉列表配置

原本在写这个插件的时候我有不少想法准备总结一下,后来写完了回头一看感受也就这样。没什么说的了,你们都是聪明人,看看就得了。因此就这样吧。

发布插件

推送到Github

代码写完以后,就能发布了。首先须要将它推送到Github。咱们在Github上建立一个仓库,而后把代码推动去就行了。若是对Git命令不熟悉的话,可使用Git Extensions,这是Windows下最好用的图形客户端了。

发布插件

第一步是输入apm login。这样会在浏览器中打开一个网页,在网页上登陆Atom帐号以后,复制网页上的Token,而后粘贴回命令行中,再按回车。这样就完成了登陆工做。

登陆以后,命令行切到咱们插件的Git目录中,而后输入apm publish minor,稍等片刻插件就发布成功了。这个命令能够接受minormajorpatch三个参数,当咱们须要更新大版本、小版本、修订版本的时候使用。

这个命令在后台其实会作不少事情,好比设置package.json中的版本号、添加版本标签并提交到版本库中。完成以后,会显示下面这样的祝贺信息。这样,插件就发布完成了。能够看到第一次提交插件的版本号为v0.0.1。若是咱们查看一下Github仓库,也会发现多了一个名为Prepare v0.0.1的提交。

发布完成

这时候搜索一下Atom插件仓库,会发现咱们的插件已经成功出如今了插件仓库中。这样这个插件就算开发完成了!插件地址是run-python-simply,源代码地址是Github。这个插件做用很简单,就是在cmd或者powershell中运行当前的Python文件,有兴趣的同窗能够下载试试。

相关文章
相关标签/搜索