Table of Contents
Hide
- What is inconsistent use of tabs and spaces in indentation error?
- How to fix inconsistent use of tabs and spaces in indentation error?
- Python and PEP 8 Guidelines
- Conclusion
The TabError: inconsistent use of tabs and spaces in indentation occurs if you indent the code using a combination of whitespaces and tabs in the same code block.
In Python, indentation is most important as it does not use curly braces syntax like other languages to denote where the code block starts and ends.
Without indentation Python will not know which code to execute next or which statement belongs to which block and this will lead to IndentationError.
We can indent the Python code either using spaces or tabs. The Python style guide recommends using spaces for indentation. Further, it states Python disallows mixing tabs and spaces for indentation and doing so will raise Indentation Error.
Let us look at an example to demonstrate the issue.
In the above example, we have a method convert_meter_to_cm()
, and the first line of code is indented with a tab, and the second line is indented with four white spaces.
def convert_meter_to_cm(num):
output = num * 1000
return output
convert_meter_to_cm(10)
Output
File "c:PersonalIJSCodeprgm.py", line 3
return output
^
TabError: inconsistent use of tabs and spaces in indentation
When we execute the program, it clearly shows what the error is and where it occurred with a line number.
How to fix inconsistent use of tabs and spaces in indentation error?
We have used both spaces and tabs in the same code block, and hence we got the error in the first place. We can resolve the error by using either space or a tab in the code block.
Let us indent the code according to the PEP-8 recommendation in our example, i.e., using four white spaces everywhere.
def convert_meter_to_cm(num):
output = num * 1000
return output
print(convert_meter_to_cm(10))
Output
10000
If you are using the VS Code, the easy way to solve this error is by using the settings “Convert indentation to spaces” or “Convert indentation to tabs” commands.
- Press CTRL + Shift + P or (⌘ + Shift + P on Mac) to open the command palette.
- type “convert indentation to” in the search command palette
- select your preferred options, either tab or space
Python and PEP 8 Guidelines
- Generally, in Python, you follow the four-spaces rule according to PEP 8 standards.
- Spaces are the preferred indentation method. Tabs should be used solely to remain consistent with code that is already indented with tabs.
- Do not mix tabs and spaces. Python disallows the mixing of indentation.
- Avoid trailing whitespaces anywhere because it’s usually invisible and it causes confusion.
Conclusion
If you mix both tabs and spaces for indentation in the same code block Python will throw inconsistent use of tabs and spaces in indentation. Python is very strict on indentation and we can use either white spaces or tabs in the same code block to resolve the issue.
Srinivas Ramakrishna is a Solution Architect and has 14+ Years of Experience in the Software Industry. He has published many articles on Medium, Hackernoon, dev.to and solved many problems in StackOverflow. He has core expertise in various technologies such as Microsoft .NET Core, Python, Node.JS, JavaScript, Cloud (Azure), RDBMS (MSSQL), React, Powershell, etc.
Sign Up for Our Newsletters
Subscribe to get notified of the latest articles. We will never spam you. Be a part of our ever-growing community.
By checking this box, you confirm that you have read and are agreeing to our terms of use regarding the storage of the data submitted through this form.
You can indent code using either spaces or tabs in a Python program. If you try to use a combination of both in the same block of code, you’ll encounter the “TabError: inconsistent use of tabs and spaces in indentation” error.
In this guide, we discuss what this error means and why it is raised. We’ll walk through an example of this error so you can figure out how to solve it in your code.
Find Your Bootcamp Match
- Career Karma matches you with top tech bootcamps
- Access exclusive scholarships and prep courses
Select your interest
First name
Last name
Phone number
By continuing you agree to our Terms of Service and Privacy Policy, and you consent to receive offers and opportunities from Career Karma by telephone, text message, and email.
TabError: inconsistent use of tabs and spaces in indentation
While the Python style guide does say spaces are the preferred method of indentation when coding in Python, you can use either spaces or tabs.
Indentation is important in Python because the language doesn’t depend on syntax like curly brackets to denote where a block of code starts and finishes. Indents tell Python what lines of code are part of what code blocks.
Consider the following program:
numbers = [8, 7, 9, 8, 7] def calculate_average_age(): average = sum(numbers) / len(numbers) print(average)
Without indentation, it is impossible to know what lines of code should be part of the calculate_average_age function and what lines of code are part of the main program.
You must stick with using either spaces or tabs. Do not mix tabs and spaces. Doing so will confuse the Python interpreter and cause the “TabError: inconsistent use of tabs and spaces in indentation” error.
An Example Scenario
We want to build a program that calculates the total value of the purchases made at a donut store. To start, let’s define a list of purchases:
purchases = [2.50, 4.90, 5.60, 2.40]
Next, we’re going to define a function that calculates the total of the “purchases” list:
def calculate_total_purchases(purchases): total = sum(purchases) return total
Our function accepts one parameter: the list of purchases which total value we want to calculate. The function returns the total value of the list we specify as a parameter.
We use the sum() method to calculate the total of the numbers in the “purchases” list.
If you copy this code snippet into your text editor, you may notice the “return total” line of code is indented using spaces whereas the “total = sum(purchases)” line of code uses tabs for indentation. This is an important distinction.
Next, call our function and print the value it returns to the console:
total_purchases = calculate_total_purchases(purchases) print(total_purchases)
Our code calls the calculate_total_purchases()
function to calculate the total value of all the purchases made at the donut store. We then print that value to the console. Let’s run our code and see what happens:
File "test1.py", line 5 return total ^ TabError: inconsistent use of tabs and spaces in indentation
Our code returns an error.
The Solution
We’ve used spaces and tabs to indent our code. In a Python program, you should stick to using either one of these two methods of indentation.
To fix our code, we’re going to change our function so that we only use spaces:
def calculate_total_purchases(purchases): total = sum(purchases) return total
Our code uses 4 spaces for indentation. Let’s run our program with our new indentation:
Our program successfully calculates the total value of the donut purchases.
In the IDLE editor, you can remove the indentation for a block of code by following these instructions:
- Select the code whose indentation you want to remove
- Click “Menu” -> “Format” -> “Untabify region”
- Insert the type of indentation you want to use
This is a convenient way of fixing the formatting in a document, assuming you are using the IDLE editor. Many other editors, like Sublime Text, have their own methods of changing the indentation in a file.
Conclusion
The Python “TabError: inconsistent use of tabs and spaces in indentation” error is raised when you try to indent code using both spaces and tabs.
You fix this error by sticking to either spaces or tabs in a program and replacing any tabs or spaces that do not use your preferred method of indentation. Now you have the knowledge you need to fix this error like a professional programmer!
Python известен своим простым синтаксисом. Однако, когда вы изучаете Python в первый раз или когда вы попали на Python с большим опытом работы на другом языке программирования, вы можете столкнуться с некоторыми вещами, которые Python не позволяет. Если вы когда-либо получали + SyntaxError +
при попытке запустить код Python, то это руководство может вам помочь. В этом руководстве вы увидите общие примеры неправильного синтаксиса в Python и узнаете, как решить эту проблему.
Неверный синтаксис в Python
Когда вы запускаете ваш код Python, интерпретатор сначала анализирует его, чтобы преобразовать в байтовый код Python, который он затем выполнит. Интерпретатор найдет любой недопустимый синтаксис в Python на этом первом этапе выполнения программы, также известном как этап синтаксического анализа . Если интерпретатор не может успешно проанализировать ваш код Python, это означает, что вы использовали неверный синтаксис где-то в вашем коде. Переводчик попытается показать вам, где произошла эта ошибка.
Когда вы изучаете Python в первый раз, может быть неприятно получить + SyntaxError +
. Python попытается помочь вам определить, где в вашем коде указан неверный синтаксис, но предоставляемый им traceback может немного сбить с толку. Иногда код, на который он указывает, вполне подходит.
*Примечание:* Если ваш код *синтаксически* правильный, то вы можете получить другие исключения, которые не являются `+ SyntaxError +`. Чтобы узнать больше о других исключениях Python и о том, как их обрабатывать, ознакомьтесь с https://realpython.com/python-exceptions/[Python Exceptions: Введение].
Вы не можете обрабатывать неправильный синтаксис в Python, как и другие исключения. Даже если вы попытаетесь обернуть блок + try +
и + кроме +
вокруг кода с неверным синтаксисом, вы все равно увидите, что интерпретатор вызовет + SyntaxError +
.
+ SyntaxError +
Исключение и трассировка
Когда интерпретатор обнаруживает неверный синтаксис в коде Python, он вызовет исключение + SyntaxError +
и предоставит трассировку с некоторой полезной информацией, которая поможет вам отладить ошибку. Вот некоторый код, который содержит недопустимый синтаксис в Python:
1 # theofficefacts.py
2 ages = {
3 'pam': 24,
4 'jim': 24
5 'michael': 43
6 }
7 print(f'Michael is {ages["michael"]} years old.')
Вы можете увидеть недопустимый синтаксис в литерале словаря в строке 4. Во второй записи + 'jim' +
пропущена запятая. Если вы попытаетесь запустить этот код как есть, вы получите следующую трассировку:
$ python theofficefacts.py
File "theofficefacts.py", line 5
'michael': 43
^
SyntaxError: invalid syntax
Обратите внимание, что сообщение трассировки обнаруживает ошибку в строке 5, а не в строке 4. Интерпретатор Python пытается указать, где находится неправильный синтаксис. Тем не менее, он может только указать, где он впервые заметил проблему. Когда вы получите трассировку + SyntaxError +
и код, на который указывает трассировка, выглядит нормально, тогда вы захотите начать движение назад по коду, пока не сможете определить, что не так.
В приведенном выше примере нет проблемы с запятой, в зависимости от того, что следует после нее. Например, нет проблемы с отсутствующей запятой после + 'michael' +
в строке 5. Но как только переводчик сталкивается с чем-то, что не имеет смысла, он может лишь указать вам на первое, что он обнаружил, что он не может понять.
*Примечание:* В этом руководстве предполагается, что вы знакомы с основами *tracebacks* в Python. Чтобы узнать больше о трассировке Python и о том, как их читать, ознакомьтесь с https://realpython.com/python-traceback/[Understanding Python Traceback].
Существует несколько элементов трассировки + SyntaxError +
, которые могут помочь вам определить, где в вашем коде содержится неверный синтаксис:
-
Имя файла , где встречается неверный синтаксис
-
Номер строки и воспроизводимая строка кода, где возникла проблема
-
Знак (
+ ^ +
) в строке ниже воспроизводимого кода, который показывает точку в коде, которая имеет проблему -
Сообщение об ошибке , которое следует за типом исключения
+ SyntaxError +
, которое может предоставить информацию, которая поможет вам определить проблему
В приведенном выше примере имя файла было + theofficefacts.py +
, номер строки был 5, а каретка указывала на закрывающую кавычку из словарного ключа + michael +
. Трассировка + SyntaxError +
может не указывать на реальную проблему, но она будет указывать на первое место, где интерпретатор не может понять синтаксис.
Есть два других исключения, которые вы можете увидеть в Python. Они эквивалентны + SyntaxError +
, но имеют разные имена:
-
+ +
IndentationError -
+ +
TabError
Оба эти исключения наследуются от класса + SyntaxError +
, но это особые случаи, когда речь идет об отступе. + IndentationError +
возникает, когда уровни отступа вашего кода не совпадают. + TabError +
возникает, когда ваш код использует и табуляцию, и пробелы в одном файле. Вы познакомитесь с этими исключениями более подробно в следующем разделе.
Общие проблемы с синтаксисом
Когда вы впервые сталкиваетесь с + SyntaxError +
, полезно знать, почему возникла проблема и что вы можете сделать, чтобы исправить неверный синтаксис в вашем коде Python. В следующих разделах вы увидите некоторые из наиболее распространенных причин, по которым может быть вызвано «+ SyntaxError +», и способы их устранения.
Неправильное использование оператора присваивания (+ = +
)
В Python есть несколько случаев, когда вы не можете назначать объекты. Некоторые примеры присваивают литералам и вызовам функций. В приведенном ниже блоке кода вы можете увидеть несколько примеров, которые пытаются это сделать, и получающиеся в результате трассировки + SyntaxError +
:
>>>
>>> len('hello') = 5
File "<stdin>", line 1
SyntaxError: can't assign to function call
>>> 'foo' = 1
File "<stdin>", line 1
SyntaxError: can't assign to literal
>>> 1 = 'foo'
File "<stdin>", line 1
SyntaxError: can't assign to literal
Первый пример пытается присвоить значение + 5 +
вызову + len () +
. Сообщение + SyntaxError +
очень полезно в этом случае. Он говорит вам, что вы не можете присвоить значение вызову функции.
Второй и третий примеры пытаются присвоить литералам строку и целое число. То же правило верно и для других литеральных значений. И снова сообщения трассировки указывают, что проблема возникает, когда вы пытаетесь присвоить значение литералу.
*Примечание:* В приведенных выше примерах отсутствует повторяющаяся строка кода и каретка (`+ ^ +`), указывающая на проблему в трассировке. Исключение и обратная трассировка, которые вы видите, будут другими, когда вы находитесь в REPL и пытаетесь выполнить этот код из файла. Если бы этот код был в файле, то вы бы получили повторяющуюся строку кода и указали на проблему, как вы видели в других случаях в этом руководстве.
Вероятно, ваше намерение не состоит в том, чтобы присвоить значение литералу или вызову функции. Например, это может произойти, если вы случайно пропустите дополнительный знак равенства (+ = +
), что превратит назначение в сравнение. Сравнение, как вы можете видеть ниже, будет правильным:
>>>
>>> len('hello') == 5
True
В большинстве случаев, когда Python сообщает вам, что вы делаете присвоение чему-то, что не может быть назначено, вы сначала можете проверить, чтобы убедиться, что оператор не должен быть логическим выражением. Вы также можете столкнуться с этой проблемой, когда пытаетесь присвоить значение ключевому слову Python, о котором вы расскажете в следующем разделе.
Неправильное написание, отсутствие или неправильное использование ключевых слов Python
Ключевые слова Python — это набор защищенных слов , которые имеют особое значение в Python. Это слова, которые вы не можете использовать в качестве идентификаторов, переменных или имен функций в своем коде. Они являются частью языка и могут использоваться только в контексте, который допускает Python.
Существует три распространенных способа ошибочного использования ключевых слов:
-
Неправильное написание ключевое слово
-
Отсутствует ключевое слово
-
Неправильное использование ключевого слова
Если вы неправильно написали ключевое слово в своем коде Python, вы получите + SyntaxError +
. Например, вот что происходит, если вы пишете ключевое слово + for +
неправильно:
>>>
>>> fro i in range(10):
File "<stdin>", line 1
fro i in range(10):
^
SyntaxError: invalid syntax
Сообщение читается как + SyntaxError: неверный синтаксис +
, но это не очень полезно. Трассировка указывает на первое место, где Python может обнаружить, что что-то не так. Чтобы исправить эту ошибку, убедитесь, что все ваши ключевые слова Python написаны правильно.
Другая распространенная проблема с ключевыми словами — это когда вы вообще их пропускаете:
>>>
>>> for i range(10):
File "<stdin>", line 1
for i range(10):
^
SyntaxError: invalid syntax
Еще раз, сообщение об исключении не очень полезно, но трассировка действительно пытается указать вам правильное направление. Если вы отойдете от каретки, то увидите, что ключевое слово + in +
отсутствует в синтаксисе цикла + for +
.
Вы также можете неправильно использовать защищенное ключевое слово Python. Помните, что ключевые слова разрешено использовать только в определенных ситуациях. Если вы используете их неправильно, у вас будет неправильный синтаксис в коде Python. Типичным примером этого является использование https://realpython.com/python-for-loop/#the-break-and-continue-statements [+ continue +
или + break +
] вне цикла. Это может легко произойти во время разработки, когда вы реализуете вещи и когда-то перемещаете логику за пределы цикла:
>>>
>>> names = ['pam', 'jim', 'michael']
>>> if 'jim' in names:
... print('jim found')
... break
...
File "<stdin>", line 3
SyntaxError: 'break' outside loop
>>> if 'jim' in names:
... print('jim found')
... continue
...
File "<stdin>", line 3
SyntaxError: 'continue' not properly in loop
Здесь Python отлично говорит, что именно не так. Сообщения " 'break' вне цикла "
и " 'continue' не в цикле должным образом "
помогут вам точно определить, что делать. Если бы этот код был в файле, то Python также имел бы курсор, указывающий прямо на неправильно использованное ключевое слово.
Другой пример — если вы пытаетесь назначить ключевое слово Python переменной или использовать ключевое слово для определения функции:
>>>
>>> pass = True
File "<stdin>", line 1
pass = True
^
SyntaxError: invalid syntax
>>> def pass():
File "<stdin>", line 1
def pass():
^
SyntaxError: invalid syntax
Когда вы пытаетесь присвоить значение + pass +
, или когда вы пытаетесь определить новую функцию с именем + pass +
, вы получите ` + SyntaxError + и снова увидеть сообщение
+ «неверный синтаксис» + `.
Может быть немного сложнее решить этот тип недопустимого синтаксиса в коде Python, потому что код выглядит хорошо снаружи. Если ваш код выглядит хорошо, но вы все еще получаете + SyntaxError +
, то вы можете рассмотреть возможность проверки имени переменной или имени функции, которое вы хотите использовать, по списку ключевых слов для версии Python, которую вы используете.
Список защищенных ключевых слов менялся с каждой новой версией Python. Например, в Python 3.6 вы можете использовать + await +
в качестве имени переменной или имени функции, но в Python 3.7 это слово было добавлено в список ключевых слов. Теперь, если вы попытаетесь использовать + await +
в качестве имени переменной или функции, это вызовет + SyntaxError +
, если ваш код для Python 3.7 или более поздней версии.
Другим примером этого является + print +
, который отличается в Python 2 от Python 3:
Version | print Type |
Takes A Value |
---|---|---|
Python 2 |
keyword |
no |
Python 3 |
built-in function |
yes |
+ print +
— это ключевое слово в Python 2, поэтому вы не можете присвоить ему значение. Однако в Python 3 это встроенная функция, которой можно присваивать значения.
Вы можете запустить следующий код, чтобы увидеть список ключевых слов в любой версии Python, которую вы используете:
import keyword
print(keyword.kwlist)
+ keyword +
также предоставляет полезную + keyword.iskeyword () +
. Если вам просто нужен быстрый способ проверить переменную + pass +
, то вы можете использовать следующую однострочную строку:
>>>
>>> import keyword; keyword.iskeyword('pass')
True
Этот код быстро сообщит вам, является ли идентификатор, который вы пытаетесь использовать, ключевым словом или нет.
Отсутствующие скобки, скобки и цитаты
Часто причиной неправильного синтаксиса в коде Python являются пропущенные или несовпадающие закрывающие скобки, скобки или кавычки. Их может быть трудно обнаружить в очень длинных строках вложенных скобок или длинных многострочных блоках. Вы можете найти несоответствующие или пропущенные кавычки с помощью обратных трассировок Python:
>>>
>>> message = 'don't'
File "<stdin>", line 1
message = 'don't'
^
SyntaxError: invalid syntax
Здесь трассировка указывает на неверный код, где после закрывающей одинарной кавычки стоит + t '+
. Чтобы это исправить, вы можете сделать одно из двух изменений:
-
Escape одиночная кавычка с обратной косой чертой (
+ 'don ' t '+
) -
Окружить всю строку в двойных кавычках (
" не "
)
Другая распространенная ошибка — забыть закрыть строку. Как для строк с двойными, так и с одинарными кавычками ситуация и обратная трассировка одинаковы:
>>>
>>> message = "This is an unclosed string
File "<stdin>", line 1
message = "This is an unclosed string
^
SyntaxError: EOL while scanning string literal
На этот раз каретка в трассировке указывает прямо на код проблемы. Сообщение + SyntaxError +
, " EOL при сканировании строкового литерала "
, немного более конкретно и полезно при определении проблемы. Это означает, что интерпретатор Python дошел до конца строки (EOL) до закрытия открытой строки. Чтобы это исправить, закройте строку с кавычкой, которая совпадает с той, которую вы использовали для ее запуска. В этом случае это будет двойная кавычка (`+» + `).
Кавычки, отсутствующие в инструкциях внутри f-string, также могут привести к неверному синтаксису в Python:
1 # theofficefacts.py
2 ages = {
3 'pam': 24,
4 'jim': 24,
5 'michael': 43
6 }
7 print(f'Michael is {ages["michael]} years old.')
Здесь, ссылка на словарь + ages +
внутри напечатанной f-строки пропускает закрывающую двойную кавычку из ссылки на ключ. Итоговая трассировка выглядит следующим образом:
$ python theofficefacts.py
File "theofficefacts.py", line 7
print(f'Michael is {ages["michael]} years old.')
^
SyntaxError: f-string: unterminated string
Python идентифицирует проблему и сообщает, что она существует внутри f-строки. Сообщение " неопределенная строка "
также указывает на проблему. Каретка в этом случае указывает только на начало струны.
Это может быть не так полезно, как когда каретка указывает на проблемную область струны, но она сужает область поиска. Где-то внутри этой f-строки есть неопределенная строка. Вы просто должны узнать где. Чтобы решить эту проблему, убедитесь, что присутствуют все внутренние кавычки и скобки f-строки.
Ситуация в основном отсутствует в скобках и скобках. Например, если вы исключите закрывающую квадратную скобку из списка, Python обнаружит это и укажет на это. Однако есть несколько вариантов этого. Первый — оставить закрывающую скобку вне списка:
# missing.py
def foo():
return [1, 2, 3
print(foo())
Когда вы запустите этот код, вам скажут, что есть проблема с вызовом + print () +
:
$ python missing.py
File "missing.py", line 5
print(foo())
^
SyntaxError: invalid syntax
Здесь происходит то, что Python думает, что список содержит три элемента: + 1 +
, + 2 +
и +3 print (foo ()) +
. Python использует whitespace для логической группировки вещей, и потому что нет запятой или скобки, отделяющей + 3 +
от `+ print (foo ()) + `, Python объединяет их вместе как третий элемент списка.
Еще один вариант — добавить запятую после последнего элемента в списке, оставляя при этом закрывающую квадратную скобку:
# missing.py
def foo():
return [1, 2, 3,
print(foo())
Теперь вы получаете другую трассировку:
$ python missing.py
File "missing.py", line 6
^
SyntaxError: unexpected EOF while parsing
В предыдущем примере + 3 +
и + print (foo ()) +
были объединены в один элемент, но здесь вы видите запятую, разделяющую два. Теперь вызов + print (foo ()) +
добавляется в качестве четвертого элемента списка, и Python достигает конца файла без закрывающей скобки. В трассировке говорится, что Python дошел до конца файла (EOF), но ожидал чего-то другого.
В этом примере Python ожидал закрывающую скобку (+] +
), но повторяющаяся строка и каретка не очень помогают. Отсутствующие круглые скобки и скобки сложно определить Python. Иногда единственное, что вы можете сделать, это начать с каретки и двигаться назад, пока вы не сможете определить, чего не хватает или что нет.
Ошибочный синтаксис словаря
Вы видели ссылку: # syntaxerror-exception-and-traceback [ранее], чтобы вы могли получить + SyntaxError +
, если не указывать запятую в словарном элементе. Другая форма недопустимого синтаксиса в словарях Python — это использование знака равенства (+ = +
) для разделения ключей и значений вместо двоеточия:
>>>
>>> ages = {'pam'=24}
File "<stdin>", line 1
ages = {'pam'=24}
^
SyntaxError: invalid syntax
Еще раз, это сообщение об ошибке не очень полезно. Повторная линия и каретка, однако, очень полезны! Они указывают прямо на характер проблемы.
Этот тип проблемы распространен, если вы путаете синтаксис Python с синтаксисом других языков программирования. Вы также увидите это, если перепутаете определение словаря с вызовом + dict () +
. Чтобы это исправить, вы можете заменить знак равенства двоеточием. Вы также можете переключиться на использование + dict () +
:
>>>
>>> ages = dict(pam=24)
>>> ages
{'pam': 24}
Вы можете использовать + dict () +
для определения словаря, если этот синтаксис более полезен.
Использование неправильного отступа
Существует два подкласса + SyntaxError +
, которые конкретно занимаются проблемами отступов:
-
+ +
IndentationError -
+ +
TabError
В то время как другие языки программирования используют фигурные скобки для обозначения блоков кода, Python использует whitespace. Это означает, что Python ожидает, что пробелы в вашем коде будут вести себя предсказуемо. Он вызовет + IndentationError +
, если в блоке кода есть строка с неправильным количеством пробелов:
1 # indentation.py
2 def foo():
3 for i in range(10):
4 print(i)
5 print('done')
6
7 foo()
Это может быть сложно увидеть, но в строке 5 есть только два пробела с отступом. Он должен соответствовать выражению цикла + for +
, которое на 4 пробела больше. К счастью, Python может легко определить это и быстро расскажет вам, в чем проблема.
Здесь также есть некоторая двусмысленность. Является ли строка + print ('done') +
after циклом + for +
или inside блоком цикла + for +
? Когда вы запустите приведенный выше код, вы увидите следующую ошибку:
$ python indentation.py
File "indentation.py", line 5
print('done')
^
IndentationError: unindent does not match any outer indentation level
Хотя трассировка выглядит во многом как трассировка + SyntaxError +
, на самом деле это + IndentationError +
. Сообщение об ошибке также очень полезно. Он говорит вам, что уровень отступа строки не соответствует ни одному другому уровню отступа. Другими словами, + print ('done') +
это отступ с двумя пробелами, но Python не может найти любую другую строку кода, соответствующую этому уровню отступа. Вы можете быстро это исправить, убедившись, что код соответствует ожидаемому уровню отступа.
Другой тип + SyntaxError +
— это + TabError +
, который вы будете видеть всякий раз, когда есть строка, содержащая либо табуляцию, либо пробелы для отступа, в то время как остальная часть файла содержит другую. Это может скрыться, пока Python не покажет это вам!
Если размер вкладки равен ширине пробелов на каждом уровне отступа, то может показаться, что все строки находятся на одном уровне. Однако, если одна строка имеет отступ с использованием пробелов, а другая — с помощью табуляции, Python укажет на это как на проблему:
1 # indentation.py
2 def foo():
3 for i in range(10):
4 print(i)
5 print('done')
6
7 foo()
Здесь строка 5 имеет отступ вместо 4 пробелов. Этот блок кода может выглядеть идеально для вас, или он может выглядеть совершенно неправильно, в зависимости от настроек вашей системы.
Python, однако, сразу заметит проблему. Но прежде чем запускать код, чтобы увидеть, что Python скажет вам, что это неправильно, вам может быть полезно посмотреть пример того, как код выглядит при различных настройках ширины вкладки:
$ tabs 4 # Sets the shell tab width to 4 spaces
$ cat -n indentation.py
1 # indentation.py
2 def foo():
3 for i in range(10)
4 print(i)
5 print('done')
6
7 foo()
$ tabs 8 # Sets the shell tab width to 8 spaces (standard)
$ cat -n indentation.py
1 # indentation.py
2 def foo():
3 for i in range(10)
4 print(i)
5 print('done')
6
7 foo()
$ tabs 3 # Sets the shell tab width to 3 spaces
$ cat -n indentation.py
1 # indentation.py
2 def foo():
3 for i in range(10)
4 print(i)
5 print('done')
6
7 foo()
Обратите внимание на разницу в отображении между тремя примерами выше. Большая часть кода использует 4 пробела для каждого уровня отступа, но строка 5 использует одну вкладку во всех трех примерах. Ширина вкладки изменяется в зависимости от настройки tab width :
-
Если ширина вкладки равна 4 , то оператор
+ print +
будет выглядеть так, как будто он находится вне цикла+ for +
. Консоль выведет+ 'done' +
в конце цикла. -
Если ширина табуляции равна 8 , что является стандартным для многих систем, то оператор
+ print +
будет выглядеть так, как будто он находится внутри цикла+ for +
. Консоль будет печатать+ 'done' +
после каждого числа. -
Если ширина табуляции равна 3 , то оператор
+ print +
выглядит неуместно. В этом случае строка 5 не соответствует ни одному уровню отступа.
Когда вы запустите код, вы получите следующую ошибку и трассировку:
$ python indentation.py
File "indentation.py", line 5
print('done')
^
TabError: inconsistent use of tabs and spaces in indentation
Обратите внимание на + TabError +
вместо обычного + SyntaxError +
. Python указывает на проблемную строку и дает вам полезное сообщение об ошибке. Это ясно говорит о том, что в одном и том же файле для отступа используется смесь вкладок и пробелов.
Решение этой проблемы состоит в том, чтобы все строки в одном и том же файле кода Python использовали либо табуляции, либо пробелы, но не обе. Для приведенных выше блоков кода исправление будет состоять в том, чтобы удалить вкладку и заменить ее на 4 пробела, которые будут печатать + 'done' +
после завершения цикла + for +
.
Определение и вызов функций
Вы можете столкнуться с неверным синтаксисом в Python, когда вы определяете или вызываете функции. Например, вы увидите + SyntaxError +
, если будете использовать точку с запятой вместо двоеточия в конце определения функции:
>>>
>>> def fun();
File "<stdin>", line 1
def fun();
^
SyntaxError: invalid syntax
Трассировка здесь очень полезна, с помощью каретки, указывающей прямо на символ проблемы. Вы можете очистить этот неверный синтаксис в Python, отключив точку с запятой для двоеточия.
Кроме того, ключевые аргументы как в определениях функций, так и в вызовах функций должны быть в правильном порядке. Аргументы ключевых слов always идут после позиционных аргументов. Отказ от использования этого порядка приведет к + SyntaxError +
:
>>>
>>> def fun(a, b):
... print(a, b)
...
>>> fun(a=1, 2)
File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument
Здесь, еще раз, сообщение об ошибке очень полезно, чтобы рассказать вам точно, что не так со строкой.
Изменение версий Python
Иногда код, который прекрасно работает в одной версии Python, ломается в более новой версии. Это связано с официальными изменениями в синтаксисе языка. Наиболее известным примером этого является оператор + print +
, который перешел от ключевого слова в Python 2 к встроенной функции в Python 3:
>>>
>>> # Valid Python 2 syntax that fails in Python 3
>>> print 'hello'
File "<stdin>", line 1
print 'hello'
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('hello')?
Это один из примеров, где появляется сообщение об ошибке, сопровождающее + SyntaxError +
! Он не только сообщает вам, что в вызове + print +
отсутствует скобка, но также предоставляет правильный код, который поможет вам исправить оператор.
Другая проблема, с которой вы можете столкнуться, — это когда вы читаете или изучаете синтаксис, который является допустимым синтаксисом в более новой версии Python, но недопустим в той версии, в которую вы пишете. Примером этого является синтаксис f-string, которого нет в версиях Python до 3.6:
>>>
>>> # Any version of python before 3.6 including 2.7
>>> w ='world'
>>> print(f'hello, {w}')
File "<stdin>", line 1
print(f'hello, {w}')
^
SyntaxError: invalid syntax
В версиях Python до 3.6 интерпретатор ничего не знает о синтаксисе f-строки и просто предоставляет общее сообщение «» неверный синтаксис «`. Проблема, в данном случае, в том, что код looks прекрасно работает, но он был запущен с более старой версией Python. В случае сомнений перепроверьте, какая версия Python у вас установлена!
Синтаксис Python продолжает развиваться, и в Python 3.8 появилось несколько интересных новых функций:
-
Walrus оператор (выражения присваивания)
-
F-string синтаксис для отладки
*https://docs.python.org/3.8/whatsnew/3.8.html#positional-only-parameters[Positional-only arguments]
Если вы хотите опробовать некоторые из этих новых функций, то вам нужно убедиться, что вы работаете в среде Python 3.8. В противном случае вы получите + SyntaxError +
.
Python 3.8 также предоставляет новый* + SyntaxWarning +
*. Вы увидите это предупреждение в ситуациях, когда синтаксис допустим, но все еще выглядит подозрительно. Примером этого может быть отсутствие запятой между двумя кортежами в списке. Это будет действительный синтаксис в версиях Python до 3.8, но код вызовет + TypeError +
, потому что кортеж не может быть вызван:
>>>
>>> [(1,2)(2,3)]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable
Этот + TypeError +
означает, что вы не можете вызывать кортеж, подобный функции, что, как думает интерпретатор Python, вы делаете.
В Python 3.8 этот код все еще вызывает + TypeError +
, но теперь вы также увидите + SyntaxWarning +
, который указывает, как вы можете решить проблему:
>>>
>>> [(1,2)(2,3)]
<stdin>:1: SyntaxWarning: 'tuple' object is not callable; perhaps you missed a comma?
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable
Полезное сообщение, сопровождающее новый + SyntaxWarning +
, даже дает подсказку (" возможно, вы пропустили запятую? "
), Чтобы указать вам правильное направление!
Заключение
В этом руководстве вы увидели, какую информацию предоставляет обратная связь + SyntaxError +
. Вы также видели много распространенных примеров неправильного синтаксиса в Python и каковы решения этих проблем. Это не только ускорит ваш рабочий процесс, но и сделает вас более полезным рецензентом кода!
Когда вы пишете код, попробуйте использовать IDE, который понимает синтаксис Python и предоставляет обратную связь. Если вы поместите многие из недопустимых примеров кода Python из этого руководства в хорошую IDE, то они должны выделить проблемные строки, прежде чем вы даже сможете выполнить свой код.
Получение + SyntaxError +
во время изучения Python может быть неприятным, но теперь вы знаете, как понимать сообщения трассировки и с какими формами недопустимого синтаксиса в Python вы можете столкнуться. В следующий раз, когда вы получите + SyntaxError +
, у вас будет больше возможностей быстро решить проблему!
Введение | |
Решенные проблемы |
Введение
Многие сложности возникают у новичков из-за того, что им никто не объяснил про
виртуальное окружение
.
Вы можете избавить себя от головной боли прочитав статью
virtualenv
или
venv
Установлено несколько версий Python
Итак, Вы установили python, pipe, pipenv, requests и ещё много чего, но
вдруг выяснили, что на компьютере уже не одна, а несколько версий python.
Например, у Вас установлены версии 2.7 и 3.5.
Когда Вы запускаете python, то хотите, чтобы работала последняя версия, но,
почему-то работает версия 2.7.
Выясним, как разобраться в этой ситуации.
Python -V и which python
Узнаем версию python которая вызывается командой python с флаго -V
python -V
Python 2.7.18rcl
Полезная команда, которую можно выполнить, чтобы узнать где расположен ваш Python — which
which python
/usr/bin/python
Как видите, в моей
Ubuntu
Python находится в /usr/bin/python и имеет версию 2.7.18rcl
Третий Python тоже установлен, посмотреть версию и директорию также просто
python3 -V
Python 3.9.5
which python3
/usr/bin/python3
Резюмируем: второй Python вызывается командой python а третий Python командой python3.
Обычно Python установлен в директорию /usr/bin
Ещё один способ получить эту информацию — использование команды type
type python3
python3 is hashed (/usr/bin/python3)
type python
python3 is hashed (/usr/bin/python)
Следующий способ — через sys.executable
здесь я для разнообразия настроил alias в .bashrc и теперь команда python эквивалентна python3
python
Python 3.8.5 (default, Jul 28 2020, 12:59:40)
[GCC 9.3.0] on linux
Type «help», «copyright», «credits» or «license» for more information.
>>> import sys
>>> sys.executable
‘/usr/bin/python3’
Если у вас уже был третий Python, например 3.8.5, а вы самостоятельно скачали и
установили более позднюю версию, например 3.9.1 как в
инструкции
то у вас будет два разных третьих Python.
Убедиться в этом можно изучив директорию
/usr/local/bin/
ls -la /usr/local/bin/
total 21648
drwxr-xr-x 2 root root 4096 Feb 4 11:08 .
drwxr-xr-x 10 root root 4096 Jul 31 2020 ..
lrwxrwxrwx 1 root root 8 Feb 4 11:08 2to3 -> 2to3-3.9
-rwxr-xr-x 1 root root 101 Feb 4 11:08 2to3-3.9
-rwxr-xr-x 1 root root 238 Feb 4 11:08 easy_install-3.9
lrwxrwxrwx 1 root root 7 Feb 4 11:08 idle3 -> idle3.9
-rwxr-xr-x 1 root root 99 Feb 4 11:08 idle3.9
-rwxr-xr-x 1 root root 229 Feb 4 11:08 pip3
-rwxr-xr-x 1 root root 229 Feb 4 11:08 pip3.9
lrwxrwxrwx 1 root root 8 Feb 4 11:08 pydoc3 -> pydoc3.9
-rwxr-xr-x 1 root root 84 Feb 4 11:08 pydoc3.9
lrwxrwxrwx 1 root root 9 Feb 4 11:08 python3 -> python3.9
-rwxr-xr-x 1 root root 22127472 Feb 4 11:05 python3.9
-rwxr-xr-x 1 root root 3087 Feb 4 11:08 python3.9-config
lrwxrwxrwx 1 root root 16 Feb 4 11:08 python3-config -> python3.9-config
which python3
/usr/local/bin/python3
which python3.9
/usr/local/bin/python3.9
В такой ситуации вам нужно специально указывать полную версию python3.9 для
запуска программ, либо настроить
alias
PATH
Если ни одна из команд pyhon и python3 не работает, бывает полезно проверить переменную PATH
echo $PATH
/home/andrei/.local/bin:/home/andrei/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Как вы можете убедиться моя директория /usr/bin прописана в PATH
Если вам нужно добавить директорию в PATH читайте статью
«PATH в Linux»
или статью
«PATH в Windows»
Важно понимать, что если в каждой из директорий, упомянутых в PATH, будет установлено по какому-то Python выполняться
будет тот, который в первой директории.
Если нужно использовать Python из какой-то определённой директории, нужно прописать её путь. В этом
случае не обязательно наличие этого пути в PATH
/usr/bin/python3
Python 3.8.5 (default, Jul 28 2020, 12:59:40)
[GCC 9.3.0] on linux
Type «help», «copyright», «credits» or «license» for more information.
>>>
>>> говорит о том, что Python в интерактивном режиме.
Pip
Выясним куда смотрит
pip
pip -V
/home/andrei/.local/lib/python2.7/site-packages (python 2.7)
Как видите, pip смотрит в директорию python2.7 поэтому всё, что мы до этого
устанавливали командой pip install попало к версии 2.7
а версия 3.5 не имеет ни pipenv ни requests и, например,
протестировать интерфейсы
с её помощью не получится
Если вы выполнили pip -V и получили в ответ
Command ‘pip’ not found, but there are 18 similar ones.
Посмотрите что выдаст
pip3 -V
В моей
Ubuntu
результат такой
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
Посмотреть куда pip установил пакет можно командой pip show
Проверим, куда установлен модуль requests, который пригодится нам для работы с
REST API
pip show requests
Name: requests
Version: 2.22.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: /usr/lib/python3/dist-packages
Requires:
Required-by: yandextank, netort, influxdb
alias
Если вы работаете в
Linux
можете прописать alias python=python3
Установить дополнительную версию Python
Если вы осознанно хотите установить определённую версию Python в добавок к уже существующей выполните
Куда устанавливаются различные версии Python
Просмотрите содержимое /usr/local/bin
ls -la /usr/local/bin
Результат на моём ПК показывает, что здесь находится версия 3.5
total 23620
drwxr-xr-x 0 root root 512 Mar 19 18:16 .
drwxr-xr-x 0 root root 512 Mar 30 2017 ..
lrwxrwxrwx 1 root root 8 Mar 19 18:16 2to3 -> 2to3-3.5
-rwxrwxrwx 1 root root 101 Mar 19 18:16 2to3-3.5
lrwxrwxrwx 1 root root 7 Mar 19 18:16 idle3 -> idle3.5
-rwxrwxrwx 1 root root 99 Mar 19 18:16 idle3.5
lrwxrwxrwx 1 root root 8 Mar 19 18:16 pydoc3 -> pydoc3.5
-rwxrwxrwx 1 root root 84 Mar 19 18:16 pydoc3.5
lrwxrwxrwx 1 root root 9 Mar 19 18:16 python3 -> python3.5
-rwxr-xr-x 2 root root 12090016 Mar 19 18:13 python3.5
lrwxrwxrwx 1 root root 17 Mar 19 18:16 python3.5-config -> python3.5m-config
-rwxr-xr-x 2 root root 12090016 Mar 19 18:13 python3.5m
-rwxr-xr-x 1 root root 3071 Mar 19 18:16 python3.5m-config
lrwxrwxrwx 1 root root 16 Mar 19 18:16 python3-config -> python3.5-config
lrwxrwxrwx 1 root root 10 Mar 19 18:16 pyvenv -> pyvenv-3.5
-rwxrwxrwx 1 root root 236 Mar 19 18:16 pyvenv-3.5
Версия 2.7 скорее всего здесь /home/andrei/.local/lib/
ls -la /home/andrei/.local/lib/python2.7/site-packages/
Результат на моём ПК
total 1304
drwx—— 0 andrei andrei 512 Mar 19 13:19 .
drwx—— 0 andrei andrei 512 Mar 19 13:19 ..
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 asn1crypto
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 asn1crypto-0.24.0.dist-info
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 certifi
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 certifi-2018.1.18.dist-info
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 cffi
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 cffi-1.11.5.dist-info
-rwxrwxrwx 1 andrei andrei 783672 Mar 19 13:19 _cffi_backend.so
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 chardet
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 chardet-3.0.4.dist-info
-rw-rw-rw- 1 andrei andrei 10826 Mar 19 13:19 clonevirtualenv.py
-rw-rw-rw- 1 andrei andrei 11094 Mar 19 13:19 clonevirtualenv.pyc
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 cryptography
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 cryptography-2.2.dist-info
-rw-rw-rw- 1 andrei andrei 126 Mar 19 13:19 easy_install.py
-rw-rw-rw- 1 andrei andrei 315 Mar 19 13:19 easy_install.pyc
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 enum
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 enum34-1.1.6.dist-info
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 idna
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 idna-2.6.dist-info
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 ipaddress-1.0.19.dist-info
-rw-rw-rw- 1 andrei andrei 79852 Mar 19 13:19 ipaddress.py
-rw-rw-rw- 1 andrei andrei 75765 Mar 19 13:19 ipaddress.pyc
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 .libs_cffi_backend
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 OpenSSL
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 ordereddict-1.1.dist-info
-rw-rw-rw- 1 andrei andrei 4221 Mar 19 13:19 ordereddict.py
-rw-rw-rw- 1 andrei andrei 4388 Mar 19 13:19 ordereddict.pyc
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 pathlib-1.0.1.dist-info
-rw-rw-rw- 1 andrei andrei 41481 Mar 19 13:19 pathlib.py
-rw-rw-rw- 1 andrei andrei 43650 Mar 19 13:19 pathlib.pyc
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 pip
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 pip-9.0.2.dist-info
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 pipenv
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 pipenv-11.8.2.dist-info
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 pkg_resources
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 pycparser
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 pycparser-2.18.dist-info
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 pyOpenSSL-17.5.0.dist-info
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 requests
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 requests-2.18.4.dist-info
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 setuptools
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 setuptools-39.0.1.dist-info
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 six-1.11.0.dist-info
-rw-rw-rw- 1 andrei andrei 30888 Mar 19 13:19 six.py
-rw-rw-rw- 1 andrei andrei 30210 Mar 19 13:19 six.pyc
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 urllib3
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 urllib3-1.22.dist-info
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 virtualenv-15.1.0.dist-info
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 virtualenv_clone-0.3.0.dist-info
-rw-rw-rw- 1 andrei andrei 99021 Mar 19 13:19 virtualenv.py
-rw-rw-rw- 1 andrei andrei 86676 Mar 19 13:19 virtualenv.pyc
drwxrwxrwx 0 andrei andrei 512 Mar 19 13:19 virtualenv_support
Существует несколько способов обойти эту проблему. Сперва рассмотрим использование
команды python3.
python3 -V
Python 3.5.0
Как мы только что смогли убедиться команда python3 использует новую версию Python.
Установим pip3
sudo apt install python3-pip
Проверим, что он установился в нужную директорию
pip3 -V
pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.5)
Теперь установим pipenv
pip3 install pipenv
Советую также прочитать статьи
pip
,
sys.path
Установить пакет для определённой версии Python
Если у вас несколько версий Python и нужно установить какой-то пакет только
для определённой версии, назовём её X.X, воспользуйтесь командой
pythonX.X -m pip install название_пакета —user —ignore-installed
Инструкция по установке Python на хостинге
ModuleNotFoundError: No module named ‘urllib2’
Модуль urllib2 был разделён на urllib.request и urllib.error
Поэтому строку
import urllib2
Нужно заменить на
import urllib.request
import urllib.error
TabError: inconsistent use of tabs and spaces in indentation
Эта ошибка обычно вызвана тем, что нажатие TAB не эквивалентно трём пробелам.
Можно попробовать заменить все отступы на пробелы строго соблюдая равенство
количества пробелов везде где нужно.
ModuleNotFoundError: No module named ‘requests’
Эта ошибка обычно вызвана тем, что модуль requests
не установлен, либо установлен, но не для того python, который Вы запустили.
Например, для python2.6 установлен, а для python3 не установлен.
Можно попробовать установить модуль requests. Подробнее про это
я писал в статье Тестирование с помощью Python.
Потому что столкнулся с этой проблемой впервые именно при
тестировании
API
Если эта проблема возникла при использовании PyCharm
установите requests для Вашего проекта по следующей
инструкции
Перейдите в настройки проекта нажав
CTRL + ALT + S
Выберите раздел Project Interpreter
Нажмите на плюс в правой части экрана
Введите в стоку поиска название нужного модуля. В моём случае это requests
Должно открыться окно Available Packages
Нажмите кнопку Install Package
Дождитесь окончания установки
SyntaxError: Missing parentheses in call to ‘print’
Эта ошибка обычно появляется когда Вы пробуете в python 3 использовать print без скобок,
так как это работало в python 2
print data
В python 3 нужно использовать скобки
print (data)
TypeError: getsockaddrarg: AF_INET address must be tuple, not str
Эта ошибка обычно появляется когда Вы неправильно ставите кавычку,
указывая куда нужно подключиться.
Правильный вариант — указать кортеж (tuple), который выглядит следующим образом:
(ip, port), ip обычно в кавычках, порт без
Пример (‘10.6.0.100’, 10000)
sock.connect(('10.6.0.130' ,9090))
Ошибка возникает если взять в кавычки и ip и порт,
тогда вместо кортежа передаётся строка, на что и жалуется
интерпретатор.
sock.connect(('10.6.0.130 ,9090'))
Traceback (most recent call last):
File «send.py», line 4, in <module>
sock.connect((‘10.6.0.130,9090’))
TypeError: getsockaddrarg: AF_INET address must be tuple, not str
Не выполняется команда virtualenv
Если Вы только что установили
virtualenv
, но при попытке выполнить
virtualenv new_env
или
venv new_env
Вы получаете что-то в духе:
virtualenv : The term ‘virtualenv’ is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name,
or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ virtualenv juha_env
+ ~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (virtualenv:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Попробуйте
python -m virtualenv new_env
Не активируется виртуальное окружение
Сначала разберём случай в чистом virtualenv потом перейдём к virtualenvwrapper-win
1. virtualenv
Вы под
Windows
и пытаетесь активировать Ваше виртуальное окружение, которое называется, допустим, test_env командой
test_envScriptsactivate.bat
И ничего не происходит
Вы пробуете
test_envScriptsactivate.ps1
И получаете
.test_envScriptsactivate.ps1 : File C:UsersAndreivirtualenvstest_envScriptsactivate.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see
about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:1
+ .test_envScriptsactivate.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
Нужно зайти в PowerShell в режиме администратора и выполнить
Set-ExecutionPolicy Unrestricted -Force
И выполните ещё раз
test_envScriptsactivate.ps1
Set-ExecutionPolicy -Scope CurrentUser Unrestricted -Force
2. virtualenvwrapper-win
Вы установили
virtualenvwrapper-win
и создали новое окружение
mkvirtualenv testEnv
created virtual environment CPython3.8.2.final.0-32 in 955ms
creator CPython3Windows(dest=C:UsersAndreiEnvstestEnv, clear=False, global=False)
seeder FromAppData(download=False, pip=latest, setuptools=latest, wheel=latest, via=copy, app_data_dir=C:UsersAndreiAppDataLocalpypavirtualenvseed-app-datav1.0.1)
activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
Его видно в списке окружений
lsvirtualenv
dir /b /ad «C:UsersAndreiEnvs»
==============================================================================
testEnv
И
workon
его видит
workon
Pass a name to activate one of the following virtualenvs:
==============================================================================
testEnv
Чтобы активировать его вводим
workon testEnv
NameError: name ‘psutil’ is not defined
NameError: name ‘psutil’ is not defined
Подобные ошибки возникают если ещё не установили какую-то
библиотеку, но уже попробовали ей воспользоваться
sudo apt install -y python-psutil
Сложности при работе с Python | |
Python | |
Установлено несколько версий Python | |
Установить дополнительную версию Python | |
Проверка системного пути | |
Куда устанавливаются различные версии Python | |
Установить пакет для определённой версии Python | |
AttributeError: partially initialized module ‘datetime’ has no attribute ‘date’ | |
ModuleNotFoundError: No module named ‘requests‘ | |
ModuleNotFoundError: No module named ‘urllib2‘ | |
ModuleNotFoundError: No module named numpy | |
SyntaxError: Missing parentheses in call to ‘print’ | |
SyntaxError: Non-ASCII character | |
TabError: inconsistent use of tabs and spaces in indentation | |
TypeError: getsockaddrarg: AF_INET address must be tuple, not str | |
TypeError: unsupported operand type(s) for +: | |
TypeError: module object is not callable | |
TypeError: ‘str’ object is not callable | |
TypeError: __init__() got an unexpected keyword argument ‘capture_output’ | |
TypeError: ‘generator’ object is not subscriptable | |
virtualenv : The term ‘virtualenv’ is not recognized | |
Не активируется виртуальное окружение | |
SSL module is not available | |
UnicodeDecodeError: ‘charmap’ codec can’t decode byte 0x90 in position |