为什么在Windows上python3idle中可以工作,而在Ubuntu的终端上却不行?

2024-05-29 09:36:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个程序,其中我使用input()从STDIN获取输入。在

我使用输入从一行中读取第一个单词并将其用作字典键,随后的每个单词都添加到一个列表中,该列表是前面提到的键的值。在

输入在一个文件names.txt

Victor Bertha Amy Diane Erika Clare
Wyatt Diane Bertha Amy Clare Erika
Xavier Bertha Erika Clare Diane Amy
Yancey Amy Diane Clare Bertha Erika
Zeus Bertha Diane Amy Erika Clare

Amy Zeus Victor Wyatt Yancey Xavier
Bertha Xavier Wyatt Yancey Victor Zeus
Clare Wyatt Xavier Yancey Zeus Victor
Diane Victor Zeus Yancey Xavier Wyatt
Erika Yancey Wyatt Zeus Xavier Victor

例如,men["Victor"] = ["Bertha","Amy","Diane","Erika","Clare"]。在

代码位于文件GS.py(Gale Shapley的一个实现):

^{pr2}$

当在Windows上使用IDLE时,我只需粘贴这个文件的内容并按enter,它就可以工作了。在

但是使用Ubuntu,我可以python3 GS.py < names.txt并且我得到这样的结果:

me@glados:~$ python3 GS.py < names.txt
['Victor Bertha Amy Diane Erika Clare']
['Victor', 'Bertha', 'Amy', 'Diane', 'Erika', 'Clare']
man
['Bertha', 'Amy', 'Diane', 'Erika', 'Clare']
Traceback (most recent call last):
  File "GS.py", line 83, in <module>
    if husband[w] == 0:
KeyError: 'Bertha'

(编辑)现在,当我这样做时,cat names.txt | python3 GS.py我得到了:

ajg9132@glados:~$ cat names.txt | python GS.py
Traceback (most recent call last):
  File "GS.py", line 50, in <module>
    data = input("").split("\n")
  File "<string>", line 1
    Victor Bertha Amy Diane Erika Clare
                ^
SyntaxError: invalid syntax

我不知道该怎么办-对I/O一无所知。有什么帮助吗?在

编辑注意:我认为我给出的两个不同的bash命令是等价的,但是我又是一个十足的傻瓜,所以解释一下它们为什么不同也会有帮助。。。在

为了消除歧义,这是一个算法作业。。。(很遗憾,我了解算法,但不了解操作系统的底层细节),我需要有一个具体的输入和输出方案。e、 g

spock $ java GS
Victor Bertha Amy Diane Erika Clare
Wyatt Diane Bertha Amy Clare Erika
Xavier Bertha Erika Clare Diane Amy
Yancey Amy Diane Clare Bertha Erika
Zeus Bertha Diane Amy Erika Clare

Amy Zeus Victor Wyatt Yancey Xavier
Bertha Xavier Wyatt Yancey Victor Zeus
Clare Wyatt Xavier Yancey Zeus Victor
Diane Victor Zeus Yancey Xavier Wyatt
Erika Yancey Wyatt Zeus Xavier Victor

Victor Amy
Wyatt Clare
Xavier Bertha
Yancy Erika
Zeus Diane
spock $

我不这么做的唯一原因是,将几行文本粘贴到PuTTY中使bash尝试将每一行解释为一个命令。我简直无语了。在


Tags: 文件pytxtgsnamesvictorzeuswyatt
1条回答
网友
1楼 · 发布于 2024-05-29 09:36:50

input()的含义已经改变。在

在python3.2中:http://docs.python.org/py3k/library/functions.html#input

在python2.7.2中:http://docs.python.org/library/functions.html#input

您可以通过两个小的测试程序看到这一点。唯一的区别是一个使用Python 2.7解释器,另一个使用Python 3.2解释器:

$ cat input27.py 
#!/usr/bin/python2.7
data = input("")

for l in data.split("\n"):
    print(l)
$ cat input32.py 
#!/usr/bin/python3.2
data = input("")

for l in data.split("\n"):
    print(l)
$ ./input27.py < names.txt 
Traceback (most recent call last):
  File "./input27.py", line 2, in <module>
    data = input("")
  File "<string>", line 1
    Victor Bertha Amy Diane Erika Clare
                ^
SyntaxError: invalid syntax
$ ./input32.py < names.txt 
Victor Bertha Amy Diane Erika Clare
$ 

请注意,即使python3.2版本没有抛出错误,它也没有像人们预期的那样打印names.txt中的所有行。在

我认为input()方法不值得使用。Easier将使用新的^{}方法代替:

^{pr2}$

(我删除了names.txt中的一个空白行,因为它导致这个简单的程序抛出一个错误。它实际上不会在你的成熟程序中成为一个问题,因为你正确地处理空白行。

我无法解释为什么input()在Windows下工作,但是input()感觉是一个非常糟糕的界面(谁认为通过eval运行用户提供的输入是个好主意?!?希什)只是重写它。在

更新

好吧,我有足够的兴趣来解决这个问题。我把你所有的调试代码都拿回来了,并改用了for l in sys.stdin:方法:

$ ./GS.py 
Victor Bertha Amy Diane Erika Clare
Wyatt Diane Bertha Amy Clare Erika
Xavier Bertha Erika Clare Diane Amy
Yancey Amy Diane Clare Bertha Erika
Zeus Bertha Diane Amy Erika Clare

Amy Zeus Victor Wyatt Yancey Xavier
Bertha Xavier Wyatt Yancey Victor Zeus
Clare Wyatt Xavier Yancey Zeus Victor
Diane Victor Zeus Yancey Xavier Wyatt
Erika Yancey Wyatt Zeus Xavier Victor

Wyatt Clare
Xavier Bertha
Yancey Erika
Zeus Diane
Victor Amy
$ cat GS.py 
#!/usr/bin/python3.2

if __name__ == "__main__":
    import sys

    ## Data Dictionary

    ''' Name : Preferences '''
    men = dict()
    women = dict()

    ''' List of unmatched men '''
    freeMen = list()

    ''' Name : How far down in preferences '''
    count = dict()

    ''' Name : Current Match '''
    wife = dict()
    husband = dict()

    ## Reading Input
    readingMen = True
    for l in sys.stdin:
        line = l.split()
        if len(line) > 1:
            newPerson = line[0]
            newPersonPreferences = list()
            for i in range(1,len(line)):
                newPersonPreferences.append(line[i])
            if readingMen:
                men[newPerson] = newPersonPreferences
                wife[newPerson] = 0
                count[newPerson] = 0
                freeMen.append(newPerson)
            else:
                women[newPerson] = newPersonPreferences
                husband[newPerson] = 0
        elif len(line) == 1:
            raise IOError(l + "\nis an invalid line.")
        else:
            readingMen = False

    ## Proposing
    while len(freeMen) != 0:
        m = freeMen[0]
        w = men[m][count[m]]
        count[m] += 1
        if husband[w] == 0:
            husband[w] = m
            wife[m] = w
            freeMen.remove(m)
        else:
            try:
                if women[w].index(husband[w], women[w].index(m)):
                    freeMen.append(husband[w])
                    wife[husband[w]] = 0
                    husband[w] = m
                    wife[m] = w
                    freeMen.remove(m)
            except ValueError:
                pass

    ## Match Printing
    print()
    for m in wife:
        print(m, wife[m])

$ 

请注意,如果以这种方式运行,则在粘贴完输入后,必须按^D。(我更喜欢IO重定向./GS.py < names.txt,但如果你的教授会复制粘贴,那么请确保你的教授知道点击^D来表示输入结束。)

相关问题 更多 >

    热门问题