Устранение общих проблем с Python

Узнайте, как устранять общие проблемы с Python.

Требования

  • Установленный и запущенный Python
  • сервер Linux

Простой сценарий для тестирования Python

Для целей тестирования лучше всего сохранять простоту. Используйте этот сценарий для тестирования Python либо из командной строки, либо в браузере:

#!/usr/bin/python

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

Сохраните этот сценарий в файле helloworld.py.

Начните поиск и устранение неисправностей с тестирования вашего сценария из командной строки:

sudo python helloworld.py

Вывод должен выглядеть следующим образом:

Расшифровка ошибки Python

Когда Python обнаруживает проблему в сценарии, он старается изо всех сил сообщить вам, что это за проблема и где она находится.

Вот пример ошибки, возникающей при удалении двоеточия : в конце оператора for:

В этом сообщении об ошибке есть три элемента:

  • Строка кода, в которой произошла ошибка (в данном примере строка 3).
  • Указатель ^, который выделяет точное местоположение ошибки (в меру возможностей Python).
  • Само сообщение об ошибке («SyntaxError: invalid syntax»).

В этом примере Python точно определил проблему. В некоторых ситуациях — в частности, когда отсутствует кавычка или завершающая скобка — Python не может так легко определить местоположение ошибки. Поэтому, когда вы читаете эти ошибки, имейте в виду, что проблема может возникнуть в том месте, которое определил Python, или даже раньше.

Разрешение отклонено

Если при попытке запустить этот скрипт Python из командной строки вы получаете ошибку «permission denied», скорее всего, права доступа неправильные.

Решение этой проблемы будет зависеть от того, как вы вызываете сценарий.

Отказ в разрешении при запуске сценария с помощью команды Python

В отличие от CGI-сценариев, сценарии Python не нуждаются в разрешениях на выполнение, когда вы вызываете их с помощью команды python. Python — интерпретируемый язык, а это значит, что если вы вызываете файл командой python [имя файла], Python сам обрабатывает выполнение. Файл должен быть доступен только для чтения Python.

Чтобы установить это, используйте команду :

sudo chmod 644 helloworld.py

Чтобы проверить права доступа, перечислите файлы в каталоге с помощью команды:

sudo ls -la

В этом примере видно, что файл helloworld.py имеет разрешение на чтение/запись для владельца и разрешение на чтение для group и world (chmod 644):

Вы сможете запустить этот тестовый сценарий с помощью команды:

sudo python helloworld.py

Отказано в разрешении при запуске сценария из командной оболочки

Другой способ запустить сценарий Python — это вызвать его непосредственно из оболочки:

./helloworld.py

Из-за того, как shell интерпретирует эту команду, файл должен быть исполняемым. Чтобы исправить разрешения, используйте команду:

sudo chmod 755 helloworld.py

Чтобы проверить разрешения, перечислите файлы в каталоге с помощью команды:

sudo ls -la

В этом примере видно, что файл helloworld.py имеет разрешение на чтение/запись/исполнение для владельца и разрешение на чтение/запись для группы и world (chmod 755):

Вы сможете запустить этот тестовый сценарий с помощью команды:

./helloworld.py

Bad interpreter: No such file or directory

Существует вторая особенность вызова сценария Python непосредственно из оболочки в командной строке: путь к Python должен быть правильным. В противном случае вы получите ошибку «Bad interpreter: No such file or directory».

Вы можете найти путь к Python из командной строки с помощью команды :

which python

Обычно путь к Python — это /usr/bin/python, но он может меняться в зависимости от установки или операционной системы.

Первая строка сценария — #!, за которой следует путь к Python в вашей системе. Например, если путь к Python — /usr/bin/python, первая строка сценария должна быть следующей:

#!/usr/bin/python
Проверка домена

Сообщения IndentationError

Python чувствителен к пробельным символам (пустым местам в начале строки). Каждая строка должна иметь правильный отступ, потому что именно так Python «читает» вложенные блоки кода. Эти ошибки также могут возникать, если вы смешиваете символы табуляции с пробелами.

Существует три связанные между собой ошибки:

  • неожиданный отступ: В начале строки есть один или несколько пробелов, которых там быть не должно.
  • unindent не совпадает ни с одним внешним уровнем отступа: В начале строки меньше пробелов, чем должно быть.
  • ожидается блок с отступом: Блок кода должен иметь пробелы в начале каждой строки, но этого не происходит.

Например, если вы копируете и вставляете скрипт с веб-страницы, иногда вы случайно вставляете пробелы в начале каждой строки.

Этот пробел необходимо удалить, чтобы сценарий выполнялся правильно.

Сообщение об ошибке 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: cannot concatenate ‘str’ and ‘int’ objects».

Пример кода, который приводит к этой ошибке:

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» означает, что в вашем коде есть опечатка. Некоторые распространенные упущения и ошибки включают:

  • Использование одиночного =, когда вы имели в виду ==.
  • Забыв поставить символ : в конце оператора типа for, while, if и т.д.
  • Пропущенная ] или ) скобка.
  • Использование ; точки с запятой, когда вы имели в виду : двоеточие.
  • Случайная замена одной ( скобки или [ квадратной скобки на { фигурную скобку.
  • Орфографические ошибки, например, fro вместо for.
  • Отсутствие ‘ кавычек при работе со строкой, например print(‘widgets) или print(widgets’).

Сценарий Python не запускается в браузере

Если вы закинете скрипт Python в веб-каталог и запустите его в браузере, вы, скорее всего, получите в браузере только текст скрипта, а не вывод самого скрипта.

Существует два варианта запуска сценариев Python в веб-браузере:

  1. Рассматривать файлы Python как CGI-сценарии и запускать их из каталога cgi-bin.
  2. Установить веб-фреймворк для Python.

Какой вариант вы выберете, зависит от ваших индивидуальных потребностей и предпочтений.

Вариант 1: Запуск сценариев Python как CGI-сценариев

Чтобы запустить сценарий Python как CGI-сценарий, просто поместите сценарий в каталог /cgi-bin/ вашего веб-сервера и сделайте файл исполняемым с помощью команды:

sudo chmod 755 [filename]

Например, чтобы сделать файл helloworld.py исполняемым, нужно выполнить следующую команду:

sudo chmod 755 helloworld.py

Если на вашем веб-сервере не настроен каталог /cgi-bin/, обратитесь к нашему руководству по настройке CGI bin.

Вариант 2: Установите веб-фреймворк для Python

Веб-фреймворк для Python позволяет разработчикам писать веб-приложения на Python. Существует множество веб-фреймворков для Python. Каждый из них имеет свои преимущества и недостатки, которые необходимо учитывать, прежде чем выбрать, какой из них установить.

Некоторые популярные веб-фреймворки Python включают:

  • Bottle
  • CherryPy
  • Django
  • Flask
  • web2py

На официальном сайте Python.org Wiki есть полный список существующих (и неактивных) веб-фреймворков Python.

В качестве примера мы установим Bottle, который является легким веб-фреймворком Python, простым в установке и использовании.

Установка Bottle

Установка Bottle на CentOS 7 и Ubuntu 14.04 состоит из двух этапов. Сначала вы должны установить Pip, который является менеджером пакетов для Python. Затем вы используете Pip для установки Bottle.

Установка Bottle на CentOS 7

Начните с установки репозитория EPEL с помощью команды:

sudo yum install epel-release

Затем установите Pip с помощью команды:

sudo yum install python-pip

Наконец, используйте Pip для установки Bottle с помощью команды:

sudo pip install bottle

Установка Bottle на Ubuntu 14.04

Сначала установите Pip с помощью команды:

sudo apt-get install python-pip

Затем используйте Pip для установки Bottle с помощью команды:

sudo pip install bottle

Пример: Использование Bottle для запуска простого скрипта Python

Перейдите в корневой каталог вашего сайта и создайте файл helloworld.py с помощью команды:

sudo nano helloworld.py

В первой строке файла нужно вызвать Bottle, а также импортировать route и run:

from bottle import route, run

Далее мы определим route как /helloworld. Это URL, который вы будете использовать для доступа к вашему скрипту:

@route('/helloworld')

Следующие две строки определяют функцию helloworld, которая выведет «Hello World» в браузер:

def helloworld():
    return "Hello World"

Последняя строка нашего тестового скрипта определяет хост и порт, используемые для доступа к скрипту.

  • Для хоста используйте доменное имя или IP-адрес вашего сервера.
  • Для порта используйте 8080. Если ваш сервер находится за брандмауэром, вам может потребоваться разрешить доступ к этому порту, прежде чем продолжить.

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

Примечание: Вы можете использовать любой порт для своих скриптов Bottle. Порт 8080 обычно используется для альтернативных веб-служб. Если порт 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`, чтобы выйти из скрипта и вернуться в командную строку.

Оцените статью
cdelat.ru
Добавить комментарий