如何在 VSC python 代码中重定向输入和输出?
How do I redirect input and output in VSC python code?
我已经尝试了“<”和“>”命令,但 vsc 仍然使用终端。
我的launch.json:
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"args": ["<", "${workspaceFolder}input.txt"]
这会在 vsc 的终端产生这个结果:
(.venv) PS C:\Users\domip\Desktop\Python> c:; cd 'c:\Users\domip\Desktop\Python'; & 'c:\Users\domip\Desktop\Python\.venv\Scripts\python.exe' 'c:\Users\domip\.vscode\extensions\ms-python.python-2021.12.1559732655\pythonFiles\lib\python\debugpy\launcher' '63669' '--' 'c:\Users\domip\Desktop\Python\ea2\fizzbuzz.py' '<' 'C:\Users\domip\Desktop\Pythoninput.txt'
但是调试的时候还是用终端来请求输入。如果我使用 ">", "output.txt"
,也是如此。输出写在终端上,而不是 txt 文件中。我已尝试手动 运行 它的行为方式相同。
我是 python 的新手。为了测试,我使用 input()
函数。我尝试使用 main()
函数,也许需要将 args 传递给它但没有效果。当我用 C(在 vsc 中)编码时,我对此没有问题。
我已经尝试了我在互联网上找到的所有内容。没有任何帮助。
谢谢
如您所见,<
被 ms-python 扩展很好地放在引号内,因此 shell 不会将其视为重定向。
可以做到,但需要一些配置。
您必须自己设置调试客户端和服务器。
调试服务器设置为一项任务。客户端是附加启动配置。
首先你需要找到 debugpy
模块的位置,它是 ms-python 扩展的一部分(你可以在你的环境中作为一个单独的模块安装,但如果你已经有它)。
我使用以下 2 个文件:
redir_input.py
while True:
try:
line = input()
except EOFError:
break
print(line)
input.txt
line 1
line 2
line 3
使用 redir_input.py
文件启动调试会话(从终端获取输入)。使用 Ctrl+Z Enter
.
终止程序
我们要的是终端显示的命令。类似于:
<path>/.venv/Scripts/python <path>/.vscode/extensions/ms-python.python-2021.12.1559732655/pythonFiles/lib/python/debugpy/launcher 64141 -- <path>/redir_input.py
我们需要第二个字符串:debugpy
模块的位置(没有 /launcher
部分)
<path>/.vscode/extensions/ms-python.python-2021.12.1559732655/pythonFiles/lib/python/debugpy
<path>
是针对您的机器的。
在.vscode/tasks.json
中创建一个将启动程序进行调试的任务:
{
"version": "2.0.0",
"tasks": [
{
"label": "Script with redirect input",
"type": "shell",
"command": "${command:python.interpreterPath} <path>/.vscode/extensions/ms-python.python-2021.12.1559732655/pythonFiles/lib/python/debugpy
--listen 5678 --wait-for-client ${workspaceFolder}/redir_input.py < ${workspaceFolder}/input.txt",
"problemMatcher": []
}
]
}
现在设置一个复合启动配置,一个启动调试服务器,一个附加调试客户端。调试服务器启动一个虚拟 python 脚本,因为我们实际上需要 prelaunchTask
.
.vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Attach to Process port 5678",
"type": "python",
"request": "attach",
"connect": {
"host": "localhost",
"port": 5678
}
},
{
"name": "Python: Start Process port 5678",
"type": "python",
"request": "launch",
"code": "print()",
"preLaunchTask": "Script with redirect input"
}
],
"compounds": [
{
"name": "Debug with input redir",
"configurations": [
"Python: Start Process port 5678",
"Python: Attach to Process port 5678"
]
}
]
}
Select 使用输入 redir 作为 运行(调试栏顶部)的启动配置进行调试,然后按 运行 按钮(小绿色箭头)或 F5
调试器等待客户端连接 (--wait-for-client
),很可能您想在读取行时设置断点。
将创建 2 个终端。 Select 正确的是 program/task 运行ning.
您可以更改任务名称和启动配置。请务必更新多个位置的名称。
编辑
另一种方法是更改程序的 sys.stdin
和 sys.stdout
。
然后就可以使用正常的调试器方法了。
redir_input_2.py
import sys
infile = open('input.txt')
sys.stdin = infile
while True:
try:
line = input()
except EOFError:
break
print(line)
if infile: infile.close()
这里我已经硬编码了,但是当你使用特定的命令行选项时,你可以添加argparse
来完成它。
redir_input_2.py --redir-input input.txt --redir-output output.txt
我已经尝试了“<”和“>”命令,但 vsc 仍然使用终端。
我的launch.json:
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"args": ["<", "${workspaceFolder}input.txt"]
这会在 vsc 的终端产生这个结果:
(.venv) PS C:\Users\domip\Desktop\Python> c:; cd 'c:\Users\domip\Desktop\Python'; & 'c:\Users\domip\Desktop\Python\.venv\Scripts\python.exe' 'c:\Users\domip\.vscode\extensions\ms-python.python-2021.12.1559732655\pythonFiles\lib\python\debugpy\launcher' '63669' '--' 'c:\Users\domip\Desktop\Python\ea2\fizzbuzz.py' '<' 'C:\Users\domip\Desktop\Pythoninput.txt'
但是调试的时候还是用终端来请求输入。如果我使用 ">", "output.txt"
,也是如此。输出写在终端上,而不是 txt 文件中。我已尝试手动 运行 它的行为方式相同。
我是 python 的新手。为了测试,我使用 input()
函数。我尝试使用 main()
函数,也许需要将 args 传递给它但没有效果。当我用 C(在 vsc 中)编码时,我对此没有问题。
我已经尝试了我在互联网上找到的所有内容。没有任何帮助。
谢谢
如您所见,<
被 ms-python 扩展很好地放在引号内,因此 shell 不会将其视为重定向。
可以做到,但需要一些配置。
您必须自己设置调试客户端和服务器。
调试服务器设置为一项任务。客户端是附加启动配置。
首先你需要找到 debugpy
模块的位置,它是 ms-python 扩展的一部分(你可以在你的环境中作为一个单独的模块安装,但如果你已经有它)。
我使用以下 2 个文件:
redir_input.py
while True:
try:
line = input()
except EOFError:
break
print(line)
input.txt
line 1
line 2
line 3
使用 redir_input.py
文件启动调试会话(从终端获取输入)。使用 Ctrl+Z Enter
.
我们要的是终端显示的命令。类似于:
<path>/.venv/Scripts/python <path>/.vscode/extensions/ms-python.python-2021.12.1559732655/pythonFiles/lib/python/debugpy/launcher 64141 -- <path>/redir_input.py
我们需要第二个字符串:debugpy
模块的位置(没有 /launcher
部分)
<path>/.vscode/extensions/ms-python.python-2021.12.1559732655/pythonFiles/lib/python/debugpy
<path>
是针对您的机器的。
在.vscode/tasks.json
中创建一个将启动程序进行调试的任务:
{
"version": "2.0.0",
"tasks": [
{
"label": "Script with redirect input",
"type": "shell",
"command": "${command:python.interpreterPath} <path>/.vscode/extensions/ms-python.python-2021.12.1559732655/pythonFiles/lib/python/debugpy
--listen 5678 --wait-for-client ${workspaceFolder}/redir_input.py < ${workspaceFolder}/input.txt",
"problemMatcher": []
}
]
}
现在设置一个复合启动配置,一个启动调试服务器,一个附加调试客户端。调试服务器启动一个虚拟 python 脚本,因为我们实际上需要 prelaunchTask
.
.vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Attach to Process port 5678",
"type": "python",
"request": "attach",
"connect": {
"host": "localhost",
"port": 5678
}
},
{
"name": "Python: Start Process port 5678",
"type": "python",
"request": "launch",
"code": "print()",
"preLaunchTask": "Script with redirect input"
}
],
"compounds": [
{
"name": "Debug with input redir",
"configurations": [
"Python: Start Process port 5678",
"Python: Attach to Process port 5678"
]
}
]
}
Select 使用输入 redir 作为 运行(调试栏顶部)的启动配置进行调试,然后按 运行 按钮(小绿色箭头)或 F5
调试器等待客户端连接 (--wait-for-client
),很可能您想在读取行时设置断点。
将创建 2 个终端。 Select 正确的是 program/task 运行ning.
您可以更改任务名称和启动配置。请务必更新多个位置的名称。
编辑
另一种方法是更改程序的 sys.stdin
和 sys.stdout
。
然后就可以使用正常的调试器方法了。
redir_input_2.py
import sys
infile = open('input.txt')
sys.stdin = infile
while True:
try:
line = input()
except EOFError:
break
print(line)
if infile: infile.close()
这里我已经硬编码了,但是当你使用特定的命令行选项时,你可以添加argparse
来完成它。
redir_input_2.py --redir-input input.txt --redir-output output.txt