在 Windows 中运行的 Python 脚本抛出““Ubuntu 中的错误

在 Windows 中运行的 Python 脚本抛出““Ubuntu 中的错误

我编写了一个 Python 脚本 (work.py),它在 Windows 中运行良好,但是当我在 Ubuntu 上运行它时,如果我输入名称作为细绳,但如果我输入名称作为整数一切運行良好。

名称错误:

thanapong@thanapong-Lenovo-C360:~/Desktop$ python work.py 
Hours: 72 
Minutes: 0 
Seconds: 0 
Enter the name: CHATCHAI 
Traceback (most recent call last): 
  File "work.py", line 9, in <module>
    look for = str(input("Enter the name: "))
  File "<string>", line 1, in <module> 
NameError: name 'CHATCHAI' is not defined 
thanapong@thanapong-Lenovo-C360:~/Desktop$ python work.py 
Hours: 72 
Minutes: 0 
Seconds: 0 
Enter the name: BILLY 
Traceback (most recent call last): 
  File "work.py", line 9, in <module>
    look for = input("Enter the name: ") 
  File "<string>", line 1, in <module> 
NameError: name 'BILLY' is not defined 

使用 int 可以正常工作:

thanapong@thanapong-Lenovo-C360:~/Desktop$ python work.py 
Hours: 72 
Minutes: 0 
Seconds: 0 
Enter the name: 2

3
0
Not found
1
2
3
4
0
Not found
1
2
3
4
0
Not found
1
2

这是我的代码。

import pandas as pd
import time

hourz=input('Hours: ')
minz=input('Minutes: ')
secz=input('Seconds: ')
lookfor = input("Enter the name: ")
name = str(lookfor)
x = 5
print(' ')
hour=int(hourz)
min=int(minz)
sec=int(secz)
day = int(((hour*60*60)+(min*60)+(sec))/86400)

print(day)
for b in range(day):
    for a in range(x):
        time.sleep(1)
        print(a)
        if a == 0:
            data = pd.read_csv("/media/thanapong/F91B-8B18/Customer_List.txt", header=0)
            query = data.loc[data['NAME']==name]
            if not query.empty:
                print(query)
                data.loc[data['NAME']==name, 'SCORE'] = (query.SCORE - 1)
                print()
                print(data.loc[data['NAME']==name])
                data.to_csv("/media/thanapong/F91B-8B18/Customer_List.txt", index=None)
            else:
                print('Not found')
print(' ')
print(' ')                
print("End")

这是 Customer_List.txt 的示例(它有很多行)。

ID,NAME,LASTNAME,SCORE,TEL,PASS
61070500216,CHATCHAI,KARUNA,22,123456789,12345
61070500217,BIGM,KORATBOY,15,123456789,123456789

答案1

到目前为止,在 Ubuntu 中,python系统提供的命令始终是 Python 2,从来不是 Python 3,而对于 Python 3 必须使用python3

即使在未安装 Python 2 但安装了 Python 3 的系统上也是如此。较新的 Ubuntu 版本就是这样的,有命令python3却没有python命令。您可以安装python元包,它会安装 Python 2。

较旧的 Ubuntu 版本安装的是 Python 2,而不是 Python 3。拉法说,您可以通过元包在这样的系统上安装 Python 3 python3

直到最近,python还是 Python 2(而不是 Python 3)一直是类 Unix 操作系统的官方推荐。流行的 GNU/Linux 系统都遵循了这一建议,但 Arch Linux 及其衍生产品是个显著的例外,因为这些产品上python早已安装了 Python 3。Debian 和 Ubuntu(Debian 的衍生产品)等系统至今仍在使用传统推荐的命名方案。

根据我的经验,其他一些操作系统(尤其是 Windows)的用户经常会对此感到惊讶。对于不太了解 Python 2 和 Python 3 之间区别的新手来说,这尤其令人困惑。

我的建议是:

  1. 始终了解(或找出)自己正在编写的是 Python 2 还是 Python 3。

    可以特意编写同时起到这两种作用的代码,但是这样做的人知道他们在做什么,而这不是大多数人刚开始时会做的事情。

  2. 对于您运行的 Python 源代码文件(即脚本/程序,而不是仅可用作库的模块),使用 shebang 行启动文件,指定您想要哪个解释器。

    对于 Python 3,你通常会希望使用#!/usr/bin/env python3,例如雷·巴特沃斯评论。对于 Python 2,请考虑#!/usr/bin/env python2。尽管你#!/usr/bin/env python在 Ubuntu 中使用,使用该python2命令也受支持,使您的意思对人类来说更清晰,可以在更多操作系统上运行,并且可能在未来运行更长时间。

python如果您通过将脚本名称作为参数传递给命令(如python2)或 来运行脚本,则 shebang 行不会影响所使用的解释器。python3相反,将脚本标记为可执行文件,以便您可以运行它:

chmod +x scriptname

您只需执行一次。然后您可以像这样运行脚本:

./scriptname

在 Windows 上,您可以使用pylauncher 命令运行脚本,除非您通过指定版本覆盖它,否则它会遵循您的 shebang 行。也就是说,如果您的脚本以 开头#!/usr/bin/env python2,则在 Windows 中运行的效果与 相同,如果它以 开头,则在 Windows 中运行的效果与 相同。py scriptnamepy -2 scriptname#!/usr/bin/env python3py scriptnamepy -3 scriptname

但请注意,pypython(没有版本号) 视为指定 Python 3 而不是 Python 2。这是即使在 Ubuntu 中,如果您的 shebang 行末尾也考虑写入python2(而不仅仅是python) 的另一个原因;当使用启动器时,它使您的脚本更容易移植到 Windows py


至于你为什么得到那些当你无意中在 Python 2 解释器中运行 Python 3 代码时会出现错误:inputPython 3 中的函数只是读取并返回一行输入,这正是你想要的,但是inputPython2 中的函数读取一行输入,将其视为 Python 代码,运行该代码,并返回结果值。 这有相当令人担忧的安全隐患如果使用不当(即使在 Python 2 程序中),也只是这不是人们通常想做的事情。如果您需要用 Python 2 编写脚本,则可以使用raw_input代替函数正如steeldriver所说,但真正的解决方案是使用python3如上所述,尽管它的名字实际上是 Ubuntu 中的默认 Python 解释器. 像 这样的输入123是 Python 表达式,但像 这样的输入则BILLY不是,除非定义了某个同名变量;这就是数字输入恰好起作用的原因。

答案2

我运行了您的代码,它执行正确。我无法创建与图片中相同的错误。您的代码接受字符串作为名称字段的输入。Python 版本 3.7 和操作系统 Ubuntu。请参见下面的输出:

Hours: 72
Minutes: 0
Seconds: 0
Enter the name: BILLY

3
0
   ID   NAME  LASTNAME  SCORE  ...  KORATBOY  15  123456789.1  123456789.2
0 NaN  BILLY       NaN    NaN  ...       NaN NaN          NaN          NaN

[1 rows x 16 columns]

   ID   NAME  LASTNAME  SCORE  ...  KORATBOY  15  123456789.1  123456789.2
0 NaN  BILLY       NaN    NaN  ...       NaN NaN          NaN          NaN

[1 rows x 16 columns]
1
2
3
4
0
   ID   NAME  LASTNAME  SCORE  ...  KORATBOY  15  123456789.1  123456789.2
0 NaN  BILLY       NaN    NaN  ...       NaN NaN          NaN          NaN

[1 rows x 16 columns]

   ID   NAME  LASTNAME  SCORE  ...  KORATBOY  15  123456789.1  123456789.2
0 NaN  BILLY       NaN    NaN  ...       NaN NaN          NaN          NaN

[1 rows x 16 columns]
1
2
3
4
0
   ID   NAME  LASTNAME  SCORE  ...  KORATBOY  15  123456789.1  123456789.2
0 NaN  BILLY       NaN    NaN  ...       NaN NaN          NaN          NaN

[1 rows x 16 columns]

   ID   NAME  LASTNAME  SCORE  ...  KORATBOY  15  123456789.1  123456789.2
0 NaN  BILLY       NaN    NaN  ...       NaN NaN          NaN          NaN

[1 rows x 16 columns]
1
2
3
4


End

Process finished with exit code 0

我认为解决方案是你需要python3在命令提示符下使用不是 python运行你的文件。你的代码显然是为了python3

如果你的系统上没有安装python3,你可以在终端中运行以下命令来安装它:

sudo apt install python3

相关内容