Windows + Sublime Text 2 で HTMLPrettify を使った時にNode.jsが無いと言われる件
2015/12/13
1 |
Node.js was not found in the default path. Please specify the location. |
Windows + Sublime Text2という環境で、HTMLPrettifyのHTML整形機能を使った時に、上記のようなメッセージが表示されることがあります。Node.jsが入っていないのか確認してみると、node.jsは問題なく入っているし、コマンドプロンプト上でもnodeコマンドを実行できます。
githubにある解説を見るとnode_pathの記述が間違っている場合があるので気をつけてねとのこと。
1 |
"windows": "C:/Program Files/nodejs/node.exe" |
バックスラッシュ(\マーク)ではなく、スラッシュでパスを区切る必要があるようです。あとこのパス自体が間違っていないかも要確認。
しかし、私はここの記述は間違っておらず、原因を特定できませんでした。
次に「Ctrl + `」でSublime Text2のコンソールを開いて何かログが出ていないかを確認。
1 2 3 4 5 6 7 8 9 |
Using node.js path on 'windows': C:/Program Files/nodejs/node.exe Unexpected error(<type 'exceptions.UnicodeEncodeError'>): 'ascii' codec can't encode characters in position 244-245: ordinal not in range(128) error: You won't be able to use this plugin without specifying the path to node.js. Traceback (most recent call last): File ".\sublime_plugin.py", line 362, in run_ return self.run(edit) File ".\HTMLPrettify.py", line 48, in run File ".\HTMLPrettify.py", line 110, in get_output_diagnostics AttributeError: 'NoneType' object has no attribute 'find' |
どうもエラーを吐いています。
エラーの該当箇所である「HTMLPrettify.py」を確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@staticmethod def get_output(cmd): if int(sublime.version()) < 3000: if sublime.platform() != "windows": # Handle Linux and OS X in Python 2. run = '"' + '" "'.join(cmd) + '"' return commands.getoutput(run) else: # Handle Windows in Python 2. # Prevent console window from showing. startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW return subprocess.Popen(cmd, \ stdout=subprocess.PIPE, \ startupinfo=startupinfo).communicate()[0] else: # Handle all OS in Python 3. run = '"' + '" "'.join(cmd) + '"' return subprocess.check_output(run, stderr=subprocess.STDOUT, shell=True, env=os.environ) |
ここのsubprocess.Popenでエラーを履いていました。cmd変数をascii文字にエンコードする処理が含まれているようで、cmd変数にユニコードな文字列があるとエラーとなってしまうようです。
で、原因となっているcmdの文字列ですが、中身は何かというと、HTML整形対象ファイルのパスが含まれていました。今回はこれが原因でUnicodeEncodeErrorを投げているにもかかわらず、node.jsのパスが通ってないよ!という間違ったエラーメッセージを出力しているようです。
SublimeText3はif分岐で本処理を通っていないので影響ないのかな?
対処したいところですが、pythonの文字列処理に詳しくないので誰か直してください。
暫定対処としては「パスに日本語文字列を含めない」。これでいきましょう。
ちなみにエラーハンドル部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
def run_script_on_file(self, temp_file_path): try: node_path = PluginUtils.get_node_path() script_path = PLUGIN_FOLDER + "/scripts/run.js" file_path = self.view.file_name() cmd = [node_path, script_path, temp_file_path, file_path or "?"] output = PluginUtils.get_output(cmd) # Make sure the correct/expected output is retrieved. if output.find(OUTPUT_VALID) != -1: return output msg = "Command " + '" "'.join(cmd) + " created invalid output." print(output) raise Exception(msg) except: # Something bad happened. print("Unexpected error({0}): {1}".format(sys.exc_info()[0], sys.exc_info()[1])) # Usually, it's just node.js not being found. Try to alleviate the issue. msg = "Node.js was not found in the default path. Please specify the location." if not sublime.ok_cancel_dialog(msg): msg = "You won't be able to use this plugin without specifying the path to node.js." sublime.error_message(msg) else: PluginUtils.open_sublime_settings(self.view.window()) |
ここでのエラーは何であれNode.jsが無いよってメッセージになるようです。