如何创建读取 shebang 的 Sublime Text 3 构建系统
How to create Sublime Text 3 build system which reads shebang
如何在 Sublime Text 3 中创建构建系统,其中 "cmd"
被替换为 shebang(如果存在)?
更具体地说,是否可以更改 Python 构建系统以使用 shebang 中指定的 Python 版本,如果没有 shebang 则使用默认版本?
如果认为使用标准 .sublime-build
文件执行此操作的唯一方法是将您的文件传递给另一个脚本,然后该脚本解析 shebang 并将其传递给正确的 Python 版本。
或者,您可以指定 build variants,但您必须手动选择所需的构建变体。
Sublime 构建系统有一个名为 target
的选项,它指定要调用以执行构建的 WindowCommand
。默认情况下,这是内部 exec
命令。您可以创建自己的命令来检查文件中的 shebang 并使用该解释器或其他默认值。
例如(警告:我不是很精通 Python 所以这可能很丑陋):
import sublime, sublime_plugin
class ShebangerCommand(sublime_plugin.WindowCommand):
def parseShebang (self, filename):
with open(filename, 'r') as handle:
shebang = handle.readline ().strip ().split (' ', 1)[0]
if shebang.startswith ("#!"):
return shebang[2:]
return None
def createExecDict(self, sourceDict):
current_file = self.window.active_view ().file_name()
args = dict (sourceDict)
interpreter = args.pop ("interpreter_default", "python")
exec_args = args.pop ("interpreter_args", ["-u"])
shebang = self.parseShebang (current_file)
args["shell_cmd"] = "{} {} \"{}\"".format (shebang or interpreter,
" ".join (exec_args),
current_file)
return args
def run(self, **kwargs):
self.window.run_command ("exec", self.createExecDict (kwargs))
您可以在 Packages/User
中将其保存为 python 文件(例如 shebanger.py
)。
这将创建一个名为 shebanger
的新命令,该命令收集它所提供的参数,检查 window 当前活动视图中的文件,构建被触发以查看第一行是否是一个 shebang,然后综合 exec
命令所需的参数并运行它。
由于默认的 python 构建系统假设它正在构建当前文件并将 -u
作为参数传递,这也是此命令复制的内容。但是请注意,此代码并非 100% 正确,因为 shebang 行中的任何参数都将被忽略,但您明白了总体思路。
在使用中,您可以将默认的 Python.sublime-build
文件修改为如下所示:
{
// WindowCommand to execute for this build
"target": "shebanger",
// Use this when there is no shebang
"interpreter_default": "python",
// Args to pass to the interpreter
"interpreter_args": ["-u"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python",
"env": {"PYTHONIOENCODING": "utf-8"},
"variants":
[
{
"name": "Syntax Check",
"interpreter_args": ["-m py_compile"],
}
]
}
请注意,在变体中我们重写了解释器参数;如果需要,您也可以在那里覆盖默认解释器。
我的python.sublime-build
{
"cmd": ["py", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python",
"shell":true
}
在windows中,我使用py launcher根据shebang检测版本
如何在 Sublime Text 3 中创建构建系统,其中 "cmd"
被替换为 shebang(如果存在)?
更具体地说,是否可以更改 Python 构建系统以使用 shebang 中指定的 Python 版本,如果没有 shebang 则使用默认版本?
如果认为使用标准 .sublime-build
文件执行此操作的唯一方法是将您的文件传递给另一个脚本,然后该脚本解析 shebang 并将其传递给正确的 Python 版本。
或者,您可以指定 build variants,但您必须手动选择所需的构建变体。
Sublime 构建系统有一个名为 target
的选项,它指定要调用以执行构建的 WindowCommand
。默认情况下,这是内部 exec
命令。您可以创建自己的命令来检查文件中的 shebang 并使用该解释器或其他默认值。
例如(警告:我不是很精通 Python 所以这可能很丑陋):
import sublime, sublime_plugin
class ShebangerCommand(sublime_plugin.WindowCommand):
def parseShebang (self, filename):
with open(filename, 'r') as handle:
shebang = handle.readline ().strip ().split (' ', 1)[0]
if shebang.startswith ("#!"):
return shebang[2:]
return None
def createExecDict(self, sourceDict):
current_file = self.window.active_view ().file_name()
args = dict (sourceDict)
interpreter = args.pop ("interpreter_default", "python")
exec_args = args.pop ("interpreter_args", ["-u"])
shebang = self.parseShebang (current_file)
args["shell_cmd"] = "{} {} \"{}\"".format (shebang or interpreter,
" ".join (exec_args),
current_file)
return args
def run(self, **kwargs):
self.window.run_command ("exec", self.createExecDict (kwargs))
您可以在 Packages/User
中将其保存为 python 文件(例如 shebanger.py
)。
这将创建一个名为 shebanger
的新命令,该命令收集它所提供的参数,检查 window 当前活动视图中的文件,构建被触发以查看第一行是否是一个 shebang,然后综合 exec
命令所需的参数并运行它。
由于默认的 python 构建系统假设它正在构建当前文件并将 -u
作为参数传递,这也是此命令复制的内容。但是请注意,此代码并非 100% 正确,因为 shebang 行中的任何参数都将被忽略,但您明白了总体思路。
在使用中,您可以将默认的 Python.sublime-build
文件修改为如下所示:
{
// WindowCommand to execute for this build
"target": "shebanger",
// Use this when there is no shebang
"interpreter_default": "python",
// Args to pass to the interpreter
"interpreter_args": ["-u"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python",
"env": {"PYTHONIOENCODING": "utf-8"},
"variants":
[
{
"name": "Syntax Check",
"interpreter_args": ["-m py_compile"],
}
]
}
请注意,在变体中我们重写了解释器参数;如果需要,您也可以在那里覆盖默认解释器。
我的python.sublime-build
{
"cmd": ["py", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python",
"shell":true
}
在windows中,我使用py launcher根据shebang检测版本