Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Windows上的Python3空闲时,而在Ubuntu上的终端上,这项功能可以工作?_Python_Ubuntu_Io_Python Idle - Fatal编程技术网

为什么在Windows上的Python3空闲时,而在Ubuntu上的终端上,这项功能可以工作?

为什么在Windows上的Python3空闲时,而在Ubuntu上的终端上,这项功能可以工作?,python,ubuntu,io,python-idle,Python,Ubuntu,Io,Python Idle,我有一个程序,使用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 Be

我有一个程序,使用
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
比如说,
男人[“维克多”]=“伯莎”、“艾米”、“黛安”、“埃里卡”、“克莱尔”]

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

在Windows上使用IDLE时,我只需粘贴此文件的内容并按enter键,就可以了

但使用Ubuntu时,我会使用python3 GS.py,我得到以下信息:

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'
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命令是等效的,但我是一个彻头彻尾的noob,所以解释一下它们为什么不同也会有帮助

为了消除歧义,这是一个算法作业。。。(遗憾的是,我了解算法,但不了解操作系统的底层细节),我需要有一个特定的输入和输出方案。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试图将每一行解释为一个命令。我甚至不能。

输入()的含义已经改变

在Python 3.2中:

在Python 2.7.2中:

您可以通过两个小测试程序更容易地看到这一点。唯一的区别是一个使用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
$ 

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

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

更新

好吧,我很好奇,一路解决了这个问题。我收回了所有调试代码,转而在sys.stdin:方法中对l使用

$ ./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
,但是如果你的教授会复制和粘贴,那么请确保你的教授知道点击
^D
以发出输入结束的信号。)

你是否尝试添加一些调试打印,并查看发生这种情况的位置和原因?我想没有人想把你的整个代码弄乱。我有一个坏习惯,就是在我的代码在一个平台上运行后,在另一个平台上测试之前,我会删除所有调试语句。当然马上回来这意味着它没有在字典中找到一些数据。它可能与Ubuntu/Windows的不同行尾有关,\r\n vs\n?平台不可知分裂:虽然我同意你对Windows的抱怨,但我认为input()在Windows中起作用,因为我在空闲会话中将文本粘贴到提示符中,这与piping(是这个词吗?)不同将文件的内容输入到输入流中。也就是说,我不能使用你的解决方案。。。我将使用此作业的输入和输出示例编辑我的问题。查看您的编辑。。。它确实有效。。。在Ubuntu上。在Windows上,我得到以下信息:回溯(最近一次调用最后一次):文件“D:\yada yada\GS.py”,第52行,在sys.stdin:TypeError中的l中:“RPCProxy”对象不可编辑“哈哈哈”。令人捧腹的我想我不太喜欢闲着尝试将sys.stdin:
中的l替换为sys.stdin.readlines()中的l的
——也许IDLE的代理将允许一个旧函数工作。从Python 3开始,readlines()实际上不是stdin的方法。。。以前有过这个问题。实用程序的最佳接口是模拟实用程序,例如
cat(1)
——从命令行中读取输入,不管命令行中有多少文件名作为参数给出,如果命令行中没有文件名参数,则从标准输入流中读取输入。很遗憾,闲置的环境使它无法使用。也许下一个最好的方法是将示例数据硬编码到脚本中的字符串变量中,如果用户需要不同的输入数据,则允许用户通过另一种机制提交新数据。但是你不应该和你的环境做这么多的斗争(
$ cat fixed_input27.py 
#!/usr/bin/python2.7

import sys

for line in sys.stdin:
    print(line.split()[0])
$ cat fixed_input32.py 
#!/usr/bin/python3.2

import sys

for line in sys.stdin:
    print(line.split()[0])
$ ./fixed_input27.py < names.txt 
Victor
Wyatt
Xavier
Yancey
Zeus
Amy
Bertha
Clare
Diane
Erika
$ ./fixed_input32.py < names.txt 
Victor
Wyatt
Xavier
Yancey
Zeus
Amy
Bertha
Clare
Diane
Erika
$ 
$ ./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])

$