0

ユーザーのコンピューターにある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)

私はsubprocess.PopenPythonが初めてなので、使用するのが正しい方法であるかどうかはわかりません。

繰り返しになりますが、ターミナルを開いてコマンドを実行し、ユーザーが 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 に答える