- Python: сложности, нюансы, детали.
- Установлено несколько версий Python
- Python -V и which python
- alias
- Установить дополнительную версию Python
- Куда устанавливаются различные версии Python
- Установить пакет для определённой версии Python
- ModuleNotFoundError: No module named ‘urllib2’
- TabError: inconsistent use of tabs and spaces in indentation
- ModuleNotFoundError: No module named ‘requests’
- SyntaxError: Missing parentheses in call to ‘print’
- TypeError: getsockaddrarg: AF_INET address must be tuple, not str
- Не выполняется команда virtualenv
- Не активируется виртуальное окружение
- 1. virtualenv
- 2. virtualenvwrapper-win
- NameError: name ‘psutil’ is not defined
Python: сложности, нюансы, детали.
Многие сложности возникают у новичков из-за того, что им никто не объяснил про виртуальное окружение .
Вы можете избавить себя от головной боли прочитав статью virtualenv или venv
| Установлено несколько версий Python | |
| Установить дополнительную версию Python | |
| Проверка системного пути | |
| Куда устанавливаются различные версии Python | |
| Установить пакет для определённой версии Python | |
| ModuleNotFoundError: No module named ‘urllib2’ | |
| TabError: inconsistent use of tabs and spaces in indentation | |
| ModuleNotFoundError: No module named ‘requests’ | |
| SyntaxError: Missing parentheses in call to ‘print’ | |
| TypeError: getsockaddrarg: AF_INET address must be tuple, not str | |
| virtualenv : The term ‘virtualenv’ is not recognized | |
| Не активируется виртуальное окружение | |
| TypeError: unsupported operand type(s) for +: ‘range’ and ‘range’ | |
| ModuleNotFoundError: No module named numpy | |
| SSL module is not available | |
| SyntaxError: Non-ASCII character | |
| UnicodeDecodeError: ‘charmap’ codec can’t decode byte 0x90 in position | |
| Другие статьи о Python |
Установлено несколько версий Python
Итак, Вы установили python, pipe, pipenv, requests и ещё много чего, но вдруг выяснили, что на компьютере уже не одна, а несколько версий python.
Например, у Вас установлены версии 2.7 и 3.5.
Когда Вы запускаете python, то хотите, чтобы работала последняя версия, но, почему-то работает версия 2.7.
Выясним, как разобраться в этой ситуации.
Python -V и which python
Узнаем версию python которая вызывается командой python с флаго -V
Полезная команда, которую можно выполнить, чтобы узнать где расположен ваш Python — which
Как видите, в моей Ubuntu Python находится в /usr/bin/python и имеет версию 2.7.18rcl
Третий Python тоже установлен, посмотреть версию и директорию также просто
Резюмируем: второй Python вызывается командой python а третий Python командой python3.
Обычно Python установлен в директорию /usr/bin
Ещё один способ получить эту информацию — использование команды type
python3 is hashed (/usr/bin/python3)
python3 is hashed (/usr/bin/python)
Следующий способ — через sys.executable
здесь я для разнообразия настроил alias в .bashrc и теперь команда python эквивалентна 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.
>>> import sys
>>> sys.executable
Если у вас уже был третий Python, например 3.8.5, а вы самостоятельно скачали и установили более позднюю версию, например 3.9.1 как в инструкции то у вас будет два разных третьих Python.
Убедиться в этом можно изучив директорию
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
В такой ситуации вам нужно специально указывать полную версию python3.9 для запуска программ, либо настроить alias
Если ни одна из команд pyhon и python3 не работает, бывает полезно проверить переменную PATH
Как вы можете убедиться моя директория /usr/bin прописана в PATH
Если вам нужно добавить директорию в PATH читайте статью «PATH в Linux» или статью «PATH в Windows»
Важно понимать, что если в каждой из директорий, упомянутых в PATH, будет установлено по какому-то Python выполняться будет тот, который в первой директории.
Если нужно использовать Python из какой-то определённой директории, нужно прописать её путь. В этом случае не обязательно наличие этого пути в PATH
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
/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.
Посмотрите что выдаст
В моей 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 использует новую версию Python.
sudo apt install python3-pip
Проверим, что он установился в нужную директорию
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
ModuleNotFoundError: No module named ‘urllib2’
Модуль urllib2 был разделён на urllib.request и urllib.error
Нужно заменить на
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 для Вашего проекта по следующей инструкции
Перейдите в настройки проекта нажав
Выберите раздел Project Interpreter
Нажмите на плюс в правой части экрана
Введите в стоку поиска название нужного модуля. В моём случае это requests
Введите в поиске requests
Должно открыться окно Available Packages
Нажмите кнопку Install Package
Дождитесь окончания установки
Дождитесь окончания установки
SyntaxError: Missing parentheses in call to ‘print’
Эта ошибка обычно появляется когда Вы пробуете в python 3 использовать print без скобок, так как это работало в python 2
В python 3 нужно использовать скобки
TypeError: getsockaddrarg: AF_INET address must be tuple, not str
Эта ошибка обычно появляется когда Вы неправильно ставите кавычку, указывая куда нужно подключиться.
Павильный вариант — указать кортеж (tuple), который выглядит следующим образом:
(ip, port), ip обычно в кавычках, порт без
Пример (‘10.6.0.100’, 10000)
Ошибка возникает если взять в кавычки и ip и порт, тогда вместо кортежа передаётся строка, на что и жалуется интерпретатор.
Traceback (most recent call last): File «send.py», line 4, in sock.connect((‘10.6.0.130,9090’)) TypeError: getsockaddrarg: AF_INET address must be tuple, not str
Не выполняется команда virtualenv
Если Вы только что установили virtualenv, но при попытке выполнить
Вы получаете что-то в духе:
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_env\Scripts\activate.ps1 : File C:\Users\Andrei\virtualenvs\test_env\Scripts\activate.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_env\Scripts\activate.ps1 +
+ CategoryInfo : SecurityError: (:) [], PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess
Нужно зайти в PowerShell в режиме администратора и выполнить
Set-ExecutionPolicy Unrestricted -Force
И выполните ещё раз
Если Вы не можете запустить PowerShell в режиме администратора. Например, если Вы пользуетесь терминалом в Visual Studio Code
Set-ExecutionPolicy -Scope CurrentUser Unrestricted -Force
2. virtualenvwrapper-win
Вы установили virtualenvwrapper-win и создали новое окружение
created virtual environment CPython3.8.2.final.0-32 in 955ms creator CPython3Windows(dest=C:\Users\Andrei\Envs\testEnv, clear=False, global=False) seeder FromAppData(download=False, pip=latest, setuptools=latest, wheel=latest, via=copy, app_data_dir=C:\Users\Andrei\AppData\Local\pypa\virtualenv\seed-app-data\v1.0.1) activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
Его видно в списке окружений
И workon его видит
Чтобы активировать его вводим
И ничего не происходит. Потому что virtalenvwrapper-win не работает с PowerShell.
Придётся использовать обычный command prompt или переходить в подсистему Linux
NameError: name ‘psutil’ is not defined
NameError: name ‘psutil’ is not defined
Подобные ошибки возникают если ещё не установили какую-то библиотеку, но уже попробовали ей воспользоваться
sudo apt install -y python-psutil
TypeError: unsupported operand type(s) for +: ‘range’ and ‘range’
Эта ошибка говорит о том, что вы запускаете код написанный на Python2 с помощью Python3
Установите последнюю версию Python2 по инструкции и запустите код с помощью второго Python
Источник