无法将输入发送到 Sublime Text 中正在运行的程序
- 2024-12-03 08:45:00
- admin 原创
- 233
问题描述:
我正在尝试让 Sublime Text 3 运行 Python 脚本。一个简单的两行代码
var = raw_input("Enter something: ")
print("You entered " + var)
它要求输入,等待输入,然后在 Windows 控制台提示符中将其打印出来。
看到网站上有很多类似的问题,这对很多用户来说都是一个问题,所以我浏览了这些问题并尝试了……东西。复制了 exec.py 文件,注释了其中一行,创建了一个新的 pythonw 构建文件,尝试摆弄构建文件……似乎什么都没用。
在缺乏明确的解决方案的情况下,如何使用 Sublime Text 处理输入?
解决方案 1:
Sublime Text 本身无法处理通过raw_input()
(Python 2) 或input()
(Python 3) 的输入。其他语言也是如此 - Ruby 的gets
、Java 的Scanner
类、Node 的readline
类、scanf
C、cin
C++ 等。一个短期解决方案是获取Package Control(如果您还没有),然后安装SublimeREPL。它允许您通过正在运行的 REPL 传输或运行部分或全部代码。它可能需要对Main.sublime-menu
文件进行一些配置才能使您首选的解释器正常运行。或者,您可以使用出色的Terminus插件 - 详细信息在底部。
如果你运行的代码与 SublimeREPL 不兼容(例如,你使用的是 C/C++/Java/等,需要在运行之前编译代码),或者你只是想独立于 Sublime 运行它,你需要制作自己的构建系统。将以下内容保存为Packages/User/Python_cmd.sublime-build
:
视窗
{
"cmd": ["start", "cmd", "/k", "c:/python38/python.exe", "$file"],
"selector": "source.python",
"shell": true,
"working_dir": "$file_dir",
"env": {"PYTHONIOENCODING": "utf-8"}
}
根据需要更改 Python 可执行文件的路径。然后,转到Tools -> Build System
并选择Python_cmd
,当您点击Ctrl
`B构建时,
cmd将打开一个新窗口,其中正在运行您的文件。
/k`程序运行完成后,该选项将返回命令提示符,而不关闭窗口,以便您可以检查输出、回溯等。
请注意,此构建系统是 Windows 专用的,因为 macOS 和 Linux 没有cmd
。这些平台的构建系统如下。
macOS
如果您运行的是 OS X/macOS,以下构建系统将在终端的新实例中打开您的程序。将其另存为Packages/User/Python_Terminal.sublime-build
。在我针对 macOS 10.15 进行的测试中,终端窗口在激活时并不总是位于顶部,因此您可能需要在其他窗口后面寻找它。
{
"shell_cmd": "osascript -e 'tell app \"Terminal\" to do script \"cd $file_path && python3 -u $file\"'",
"working_dir": "$file_path",
"selector": "source.python",
"env": {"PYTHONIOENCODING": "utf-8"}
}
如果您的 Python 可执行文件不在您的$PATH
.
Linux
最后,这是 Linux 的构建系统。它是在 Ubuntu 上测试的,因此如果您使用其他发行版,则需要确保gnome-terminal
已安装。将其另存为Packages/User/Python_shell.sublime-build
。程序运行完成后,按任意键关闭窗口。
{
"shell_cmd": "gnome-terminal --working-directory=$file_path -- bash -c 'python3 -u \"$file\" && read -n 1 -s -r'",
"working_dir": "$file_path",
"selector": "source.python",
"env": {"PYTHONIOENCODING": "utf-8"}
}
作为参考,该Packages
目录是选择时打开的目录Preferences → Browse Packages…
:
Linux:
~/.config/sublime-text-3/Packages
或~/.config/sublime-text/Packages
OS X:
~/Library/Application Support/Sublime Text 3/Packages
或~/Library/Application Support/Sublime Text/Packages
Windows 常规安装:或
C:UsersYourUserNameAppDataRoamingSublime Text 3Packages
`C:UsersYourUserNameAppDataRoamingSublime TextPackages`Windows 便携版安装:
InstallationFolderSublime Text 3DataPackages
InstallationFolderSublime TextDataPackages
具体路径取决于版本以及您是否从 Sublime Text 3 升级。
我只用 Python 测试了这些构建系统,但它们应该适用于任何语言。修改时,只需确保所有单引号和双引号匹配即可 - 如果不匹配,您将收到错误或意外行为。
更新
有一个独立于平台的插件叫作Terminus,它除了其他功能外,还提供了默认exec
构建系统引擎的替代品。它允许您在代码下方的构建面板中与程序进行交互。从 Package Control 安装它后,创建以下构建系统(同样适用于 Python):
{
"target": "terminus_exec",
"cancel": "terminus_cancel_build",
"cmd": [
"/path/to/python", "-u", "$file"
],
"working_dir": "$file_path",
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
}
您需要调整 Python 可执行文件的路径,如上所述。请务必阅读文档,以了解使用这个出色插件的所有其他方法。
解决方案 2:
为了补充Shritam Kumar Mund的答案,为此创建一个键绑定:
{ “keys”:[“alt + k”,“alt + k”],“命令”:“repl_open”,“args”:{“cmd”:[“python”,“-u”,“$file_basename”],“cwd”:“$file_path”,“编码”:“utf8”,“extend_env”:{“PYTHONIOENCODING”:“utf-8”},“external_id”:“python”,“语法”:“Packages/Python/Python.tmLanguage”,“type”:“subprocess”}},
我通过在控制台中使用以下命令发现了这一点:
sublime.log_commands(True)
解决方案 3:
Sublime Text 不支持将数据输入到程序中。要使用输入,您需要安装一个名为SublimeREPL的包。请按照以下步骤操作:
打开 Sublime Text >> CTRL + P
CTRL + P 将打开包控件
单击包控制:安装包
等待一秒钟弹出搜索栏。
输入 SublimeREPL 并单击它。它将在几秒钟内安装完成。
然后按照以下步骤运行您的程序;
工具>> SublimeREPL>> Python>> Python运行当前文件
它将打开一个新窗口,您可以在其中输入并获取输出。
解决方案 4:
您可以使用此sublime_buildctrl
文件,当您按下+时它会在 cmd 上运行B
。
只需转到工具->sublime build->new build system并粘贴下面的内容;
我已经根据我的经验亲自编辑了这个 sublime build 文件,相信我,它有一些很好的功能:
程序终止或结束时颜色改变
交互式输出和输入
控制台窗口自动打开
程序完成后暂停并等到输入
{
"cmd":["start", "cmd", "/c" ,"python $file && color b0 && pause"],
"selector": "source.python",
"working_dir": "${file_path}",
"file_regex": "(.+):(\\d+): error: ",
"shell": true
}
解决方案 5:
感谢@MattDMo 的回答,不需要安装任何插件。但是在我尝试了 macOS 中的命令后:
"shell_cmd": "osascript -e 'tell app \"Terminal\" to do script \"cd $file_path && python3 -u $file\"'",
我发现它似乎每次都从后台运行,这并不方便。
所以我尝试了另一种方法:使用 temp.sh 来运行。命令如下:
"cmd": ["zsh", "-c", "echo \"python3 ${file}\" > /tmp/tmp.sh ; chmod +x /tmp/tmp.sh ; open -a Terminal /tmp/tmp.sh ; sleep 2 ;rm /tmp/tmp.sh"],
此方法会在最前面弹出一个新窗口,稍加修改后在其他平台上应该也是可行的,但我没有尝试。
以下是“python_input.sublime-build”中的全部内容:
{
"cmd": ["zsh", "-c", "echo \"python3 ${file}\" > /tmp/tmp.sh ; chmod +x /tmp/tmp.sh ; open -a Terminal /tmp/tmp.sh ; sleep 2 ;rm /tmp/tmp.sh"],
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.python",
"env": {"PYTHONIOENCODING": "utf-8"},
}