0

我在 sublime 中制作了一个小脚本,它将从用户计算机上的 json 文件中提取命令,然后它将打开终端并运行设置/命令。这行得通,只是它并没有真正打开终端。它只运行命令(它可以工作,因为在我的例子中它将运行 gcc 来编译一个简单的 C 文件),并在不打开终端的情况下通过管道连接到 STDOUT。

import json
import subprocess

import sublime_plugin

class CompilerCommand(sublime_plugin.TextCommand):
    def get_dir(self, fullpath):
        path = fullpath.split("\\")
        path.pop()
        path = "\\".join(path)
        return path

    def get_settings(self, path):
        _settings_path = path + "\\compiler_settings.json"
        return json.loads(open(_settings_path).read())    

    def run(self, edit):
        _path = self.get_dir(self.view.file_name())
        _settings = self.get_settings(_path)
        _driver = _path.split("\\")[0]

        _command = _driver + " && cd " + _path + " && " + _settings["compile"] + " && " + _settings["exec"]
        proc = subprocess.Popen(_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

我不确定 usingsubprocess.Popen是否是正确的方法,因为我是 Python 新手。

所以重新迭代;我希望它打开终端,运行命令,并让终端保持打开状态,直到用户按下 ENTER 或其他键。如果这很重要,我正在运行 Windows 7 和 Python 3。

4

1 回答 1

1

subprocess.Popen只需使用给定的命令创建一个子进程。它与打开终端窗口或任何其他窗口无关。

您必须查看特定于平台的 UI 自动化解决方案才能实现您想要的。或者看看 Sublime 插件机制是否已经可以做到这一点。

笔记:

此外,您应该使用os.path.join/ os.path.split/os.path.sep等进行路径操作——例如,Sublime 也可以在 OS X 上运行,而 OS X 不使用反斜杠。此外,文件句柄需要关闭,所以使用:

with open(...) as f:
    return json.load(f)  # also not that there is no nead to f.read()+json.loads()
                         # if you can just json.load() on the file handle

此外,通常应该使用字符串插值来构建字符串:

_command = "{} && cd {} && {} && {}".format(_driver, _path, _settings["compile"], _settings["exec"])

...而且,你不应该在你的局部变量前面加上_——它看起来不好看,在 Python 中也没有任何用处;当我们在这里时,我不妨借此机会推荐您阅读 PEP8:http ://www.python.org/dev/peps/pep-0008/ 。

于 2013-10-01T09:19:04.093 回答