【问题标题】:Executing an external program in the path from Sublime Text在 Sublime Text 的路径中执行外部程序
【发布时间】:2013-12-11 23:11:20
【问题描述】:

我正在尝试为 Sublime 编写一个插件,它将读取当前行的文本,将其作为 shell 命令执行,并将命令的输出放入编辑器中。这是我目前所拥有的:

import sublime, sublime_plugin, os, os.path
import subprocess

def GetLineAtCursor(view):
    pos = view.sel()[0].a
    reg = view.line(pos)
    return view.substr(reg)

class ExecuteLineGetOutputCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        line = GetLineAtCursor(self.view).strip().split()
        output = subprocess.check_output(line,shell=True)
        self.view.insert(edit, 0, output)

这不起作用。具体来说,对subprocess.check_output(...) 的调用不起作用,尽管它在python 解释器中工作正常。我把它放在一个 try 块中,像这样:

try:
    output = subprocess.check_output(line,shell=True)
except Exception as e:
    self.view.insert(edit, 0, str(e))

无论我尝试什么命令,它都会产生以下输出:

[WinError 6] The handle is invalid

有人知道问题出在哪里,以及如何解决吗?

【问题讨论】:

    标签: python python-3.x sublimetext3 sublime-text-plugin


    【解决方案1】:

    试试这个:

    def run(self, edit):
        line = GetLineAtCursor(self.view).strip().split()
        cmd = [line, 'attr1', 'attr2']
    
        # if windows
        p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, startupinfo=startupinfo, shell=False, creationflags=subprocess.SW_HIDE)
        #else unix/macos
        p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)    
    
        output, stderr = p.communicate()
    
        if (stderr):
            print(stderr)
        self.view.insert(edit, 0, output)
    

    【讨论】:

      最近更新 更多