对常见的Python问题进行故障排除

2020年12月31日19:41:32 发表评论 62 次浏览

介绍

了解如何解决常见的Python问题。

要求

  • Python已安装并正在运行
  • Linux服务器

测试Python的简单脚本

出于测试目的, 最好使事情保持简单。使用此脚本从命令行或在浏览器中测试Python:

#!/usr/bin/python

print "Content-Type: text/html"
print "\n\n"
print "<p>Hello World</p>"

将此脚本保存在一个名为helloworld.py.

通过从命令行测试脚本开始故障排除:

sudo python helloworld.py

输出应如下所示:

使用简单的hello world脚本测试Python
使用简单的hello world脚本测试Python

解码Python错误

当Python发现脚本问题时, 它会尽最大努力告诉你问题出在哪里以及问题出在哪里。

这是删除了:冒号结尾对于声明:

示例Python错误消息
示例Python错误消息

此错误消息包含三个元素:

  • 发生错误的代码行(本示例中的第3行)
  • 一个^指针, 指出错误的确切位置(显示Python的最佳功能)。
  • 错误消息本身(" SyntaxError:无效语法")。

在此示例中, Python精确地确定了问题。在某些情况下-特别是在缺少引号或结尾括号的情况下-Python无法轻松猜测错误的位置。因此, 当你阅读这些错误时, 请记住该问题可能是在或之前Python识别的位置。

没有权限

如果尝试从命令行运行此Python脚本时收到"权限被拒绝"错误, 则很可能是权限错误。

Python错误消息:权限被拒绝
Python错误消息:权限被拒绝

此问题的解决方法将取决于你如何调用脚本。

使用Python命令运行脚本时权限被拒绝

与CGI脚本不同, 当你使用Python脚本调用Python脚本时, 无需具有执行权限即可运行python命令。 Python是一种解释性语言, 这意味着如果你使用python [文件名], Python本身负责执行。该文件只需要Python可读。

要设置此设置, 请使用以下命令:

sudo chmod 644 helloworld.py

要检查权限, 请使用以下命令列出目录中的文件:

sudo ls -la

在此示例中, 你可以看到该文件helloworld.py对所有者拥有读/写权限, 对群组和世界具有读权限(chmod 644):

644个文件权限
644个文件权限

你将可以使用以下命令运行此测试脚本:

sudo python helloworld.py

从Shell运行脚本时权限被拒绝

运行Python脚本的另一种方法是直接从shell调用它:

./helloworld.py

由于外壳解释此命令的方式, 该文件需要是可执行的。要修复权限, 请使用以下命令:

sudo chmod 755 helloworld.py

要检查权限, 请使用以下命令列出目录中的文件:

sudo ls -la

在此示例中, 你可以看到该文件helloworld.py对所有者拥有读/写/执行权限, 对群组和世界具有读/写权限(chmod 755):

具有755可执行权限的文件
具有755可执行权限的文件

你将可以使用以下命令运行此测试脚本:

./helloworld.py

错误的解释器:没有这样的文件或目录

还有第二个古怪的事情, 那就是直接在命令行上从外壳程序直接调用Python脚本:Python的路径必须正确。否则, 你将收到"错误解释器:无此类文件或目录"错误。

你可以使用以下命令从命令行找到Python的路径:

which python

通常, Python的路径是/ usr / bin / python但这取决于安装或操作系统。

脚本的第一行是#!然后是系统上Python的路径。例如, 如果Python的路径是/ usr / bin / python脚本的第一行需要读取:

#!/usr/bin/python

IndentationError消息

Python对空格(行首处的空格)敏感。每行都必须正确缩进, 因为这是Python"读取"嵌套代码块的方式。如果将制表位与空格混合使用, 也会发生这些错误。

有三个相关的错误:

  • 意外缩进:一行的开头不应有一个或多个空格。
  • unindent与任何外部缩进级别都不匹配:行首的空格比应有的少。
  • 预期缩进的块:代码块的每一行开头应有空格, 但没有。

例如, 如果你从网页复制并粘贴脚本, 有时你会意外地在每行的开头粘贴空白。

带有额外空格的Python脚本
带有额外空格的Python脚本

在脚本正常运行之前, 需要删除此空格。

删除了Python脚本空格
删除了Python脚本空格

Python错误消息通常会告诉你额外空白的确切位置。在此示例中, 错误消息指定问题出在文件的第4行:

缩进导致Python脚本出现问题
缩进导致Python脚本出现问题

如果打开文件, 将会看到这种情况:

缩进位置在Python脚本中引起问题的位置
缩进位置在Python脚本中引起问题的位置

删除第4行开头的多余空格将使此脚本正确运行。

TypeError消息

" TypeError"消息表示你正在将一种类型的数据视为另一种类型的数据。

迭代多个项目时

发生这种情况的一种方法是, 当你尝试遍历列表或字符串中的每个项目时。此错误有多种变体, 包括:

" TypeError:range()整数结束参数应为预期值, 得到列表。"

会产生此错误的代码示例:

pet = ['Dog', 'Cat', 'Guinea Pig']

for i in range(pet):
    print (pet[i])

" TypeError:列表索引必须是整数, 而不是str"

会产生此错误的代码示例:

pet = ['Dog', 'Cat', 'Guinea Pig']

for i in pet:
  print (pet[i])

解决迭代问题

这是正确执行此操作的最简单方法:

pet = ['Dog', 'Cat', 'Guinea Pig']

for i in pet:
  print i

处理数据时

" TypeError"消息的另一个来源是将非字符串数据视为字符串。

" TypeError:无法连接'str'和'int'对象"

会产生此错误的代码示例:

widgetCount = 2

print 'I would like ' + widgetCount + ' widgets.'

有两种方法可以解决此问题:

1.更改数据类型

将值放在引号内将告诉Python将其视为字符串:

widgetCount = '2'

print 'I would like ' + widgetCount + ' widgets.'

2.以整数形式调用数据

或者, 致电catCount作为整数, 使用, 用逗号代替+加号:

widgetCount = 2

print 'I would like ', widgetCount, ' widgets.'

3.正确连接数据

如果需要将字符串和整数连接成字符串, 一种正确的方法是先将整数转换为字符串格式:

widgetCount = 2
first = 'I would like '
last = ' widgets.'

request = first + str(widgetCount) + last

print request

语法错误消息

" SyntaxError"消息表示你的代码中有错字。一些常见的遗漏和错误包括:

  • 使用一个=当你的意思==.
  • 忘了放一个:在像这样的声明的结尾对于, 而, if等
  • 失踪]or)托架。
  • 用一个;当你的意思是一个分号:结肠。
  • 不小心更换了一个(括号或]方括号与{大括号。
  • 拼写错误, 例如来回代替对于.
  • 遗漏了'使用字符串时的引号, 例如打印(小配件)or打印(小配件).

Python脚本无法在浏览器中运行

如果将Python脚本放到Web目录中, 然后在浏览器中访问该脚本, 则很可能只会在浏览器中获得脚本的文本, 而不是脚本本身的输出。

在浏览器中打印出Python脚本
在浏览器中打印出Python脚本

在网络浏览器中有两个用于运行Python脚本的选项:

  1. 将Python文件视为CGI脚本, 然后将其用完吉宾目录。
  2. 为Python安装Web框架。

你选择哪种选项取决于你的个人需求和偏好。

选项1:将Python脚本作为CGI脚本运行

要将Python脚本作为CGI脚本运行, 只需将脚本放入Web服务器的/ cgi-bin /目录并使用以下命令使文件可执行:

sudo chmod 755 [filename]

例如, 使helloworld.py文件可执行文件, 命令为:

sudo chmod 755 helloworld.py

如果你的Web服务器没有/ cgi-bin /配置后, 请参考我们的有关设置CGI bin的教程。

选项2:为Python安装Web框架

Python Web框架允许开发人员使用Python编写Web应用程序。有许多适用于Python的网络框架。每一种都有其自身的优点和缺点, 在选择要安装的组件之前, 你需要考虑它们的优点和缺点。

一些流行的Python Web框架包括:

  • 瓶子
  • 樱桃派
  • Django的
  • 烧瓶
  • web2py

官方的Python.org Wiki具有当前(非活动)Python Web框架的完整列表.

例如, 我们将安装Bottle, 这是一个易于安装和使用的轻量级Python Web框架。

安装瓶子

在CentOS 7和Ubuntu 14.04上安装Bottle的过程分为两个步骤。首先你必须安装点子, 这是Python的软件包管理器。然后, 你使用Pip安装Bottle。

在CentOS 7上安装Bottle

首先使用以下命令安装EPEL存储库:

sudo yum install epel-release

接下来, 使用以下命令安装Pip:

sudo yum install python-pip

最后, 使用Pip通过以下命令安装Bottle:

sudo pip install bottle

在Ubuntu 14.04上安装Bottle

首先, 使用以下命令安装Pip:

sudo apt-get install python-pip

然后使用Pip通过以下命令安装Bottle:

sudo pip install bottle

示例:使用Bottle运行简单的Python脚本

转到你网站的根目录并创建一个名为helloworld.py使用命令:

sudo nano helloworld.py

文件的第一行需要调用Bottle, 然后导入路线和运行:

from bottle import route, run

接下来, 我们将定义路线as/你好, 世界。这是用于访问脚本的URL:

@route('/helloworld')

接下来的两行定义你好, 世界函数, 它将在浏览器中输出" Hello World":

def helloworld():
    return "Hello World"

测试脚本的最后一行将定义用于访问脚本的主机和端口。

  • 对于主机, 请使用服务器的域名或IP地址。
  • 对于端口, 使用8080。如果你的服务器位于防火墙后面, 则可能需要先允许访问此端口, 然后再继续。

    运行(主机='example.com', 端口= 8080)

注意:可以将任何端口用于Bottle脚本。通用约定将端口8080用于备用Web服务。如果服务器上正在使用端口8080, 只需选择一个未使用的端口, 以便Bottle可以绑定到该端口。

整个脚本将如下所示:

from bottle import route, run

@route('/helloworld')
def helloworld():
    return "Hello World"

run(host='example.com', port=8080)

保存并退出文件。

接下来, 你需要从命令行运行脚本, 并使其保持运行状态, 以便你可以在浏览器中访问该脚本。使用以下命令启动脚本:

sudo python helloworld.py

现在脚本正在运行, 切换到浏览器并访问URL:

http://example.com:8080/helloworld

你应该在浏览器中看到单词" Hello World"。

完成后, 可以使用'CTRL + c'退出脚本并返回命令行。

一盏木

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: