debugging Visual Studio代码调试Python在虚拟环境中从文本文件重定向输入

mjqavswn  于 2023-05-07  发布在  Python
关注(0)|答案(1)|浏览(94)

我正在遵循debugging a python file in vs code with input text file中提到的代码。获取我的错误:
1.创建新的虚拟pip虚拟环境。
1.创建名为project的新文件夹。
1.在project中,创建简单的“对两个数字进行排序”python文件hello.py

line = input()
a,b = line.split()
a = int(a)
b = int(b)
if a <= b:
    print(a)
    print(b)
else:
    print(b)
    print(a)

(If如果可能的话,我更喜欢不修改这个.py文件的答案,因为我实际上正在处理类似kattis中的问题。代码通过了https://open.kattis.com/problems/sorttwonumbers的测试。)由于我的目标是从文本文件重定向输入,因此我也在project中创建了以下input.txt

987 23

(This input.txt是合法的:例如,使用Pycharm重定向输入将使hello.py正确运行。)通过将python解释器设置为虚拟环境,我们可以看到,如果用户在命令行中给出数字,则hello.py将在虚拟环境中运行,因为绿色环境名称显示在命令行中。
1.在project中创建文件夹.vscode,我们在其中创建launch.json。这是我的两次尝试。第一次尝试引用了https://code.visualstudio.com/docs/editor/debugging#_redirect-inputoutput-tofrom-the-debug-target:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "PYTHON REDIRECT INPUT",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}\\hello",
            "console": "externalTerminal",
            "args": ["<","${workspaceFolder}\\input.txt"],
        }    
    ]
}

无论在程序中我使用hello还是hello.py,无论在控制台中我使用externalTerminal还是integratedTerminal,当我单击visual studio代码左侧菜单上的运行时,它都不会响应。最后,它总是给出:

我的第二次尝试删除args中的"<"符号:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "PYTHON REDIRECT INPUT",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}\\hello.py",
            "console": "integratedTerminal",
            "args": ["${workspaceFolder}\\input.txt"],
        }    
    ]
}

我还将外部终端更改为“integratedTerminal”,使用hello.py代替hello,并删除了args中的“〈”。因此,在运行代码时不再显示任何错误消息,也不再弹出错误窗口。如果我手动给予正确的话,代码会在所有停止点停止运行。也就是说,input.txt不参与调试。所以问题仍然没有解决。

woobm2wo

woobm2wo1#

我知道你说你不想修改你现有的代码。但是如果有一个正确的工具可以在所有环境中工作,至少在您的环境中工作,这不是一个更好的方法吗?
Python提供了一个函数fileinput.input,当不带参数调用时,它将返回类fileinput.FileInput的一个示例,该示例有一个readline方法,该方法将返回来自 stdin(可以是控制台或重定向文件)的输入行,**或者它将迭代sys.argv[1:]中列出的所有文件的行,这就是你想要做的。**对代码的更改是最小的:

import fileinput

with fileinput.input() as file:
    line = file.readline() # just read a single line

a,b = line.split()
a = int(a)
b = int(b)
if a <= b:
    print(a)
    print(b)
else:
    print(b)
    print(a)

如果上面的代码在文件test.py中,那么您可以不带参数运行它,然后您需要从控制台指定您的输入。但是您也可以向test.py传递一个参数,这是包含您的输入的文件的路径,然后相同的代码将从该文件而不是从控制台读取。或者,最后,不要将文件路径作为参数传递,您只需将文件重定向为 stdin
”””这将在你的工作环境吗?**

相关问题