Вы, вероятно, столкнулись с проблемами, так как не похоже, что вы правильно указали источник своей среды, если то, что вы опубликовали, является точным. Я также рекомендую вам указать, какую версию Python вы используете, чтобы избежать проблем с совместимостью, когда у вас есть и python2, и python3. Если это не так, отредактируйте свой вопрос, и этот ответ можно будет удалить или отредактировать в свою очередь.
Основы создания виртуальной среды Python 3:
python3 -m venv /path/to/virtual/env
source./path/to/virtual/env/bin/activate
Возможно, вам потребуется сначала установить venv
(apt install python3-venv
)и помнить, что ваш путь и сама виртуальная среда должны быть местом, в которое у вашего пользователя есть разрешение на запись. В этот момент вы должны находиться в своей виртуальной среде((env) user@host:~$ _
).
Вам не нужно sudo
с pip
. Использование sudo
с pip
устанавливает пакет глобально/для всей системы -. Это в значительной степени противоречит цели вашей виртуальной среды, которая состоит в том, чтобы изолировать среду Python для разработки и тестирования.Обратитесь к официальному Python и документации по проблемному пакету, если они не устанавливаются должным образом без sudo
, так как это может означать, что вам не хватает зависимости или дополнительных конфигураций в вашей виртуальной среде.
В системе Debian 9.8 (Linux 4.9.0 -8 -amd64 )выполнение вышеуказанных шагов, а затем выполнение следующих дало мне следующие результаты:
(env) user@host:~$ pip3 install flask
(env) user@host:~$ pip3 list --format=legacy
Click (7.0)
Flask (1.0.2)
itsdangerous (1.1.0)
Jinja2 (2.10)
MarkupSafe (1.1.1)
pip (9.0.1)
pkg-resources (0.0.0)
setuptools (32.3.1)
Wekzeug (0.15.1)
(env) user@host:~$ python3 --version
Python 3.5.3
Для этого очень конкретного случая, не рассматривали ли вы лучшее использование ip
? Например:
ip -j -p -f inet a | awk -F \" '/local/ {print $4}'
Это напечатает ip address
как объект JSON для поиска ключа local
, который используется для хранения IP-адреса. Это еще острее, которое вы можете использоватьjq
:
ip -j -p -f inet a | jq '.[].addr_info[].local'
Я рекомендую эту последнюю команду, так как она не пострадает от изменений в выводе ip addr
. Однако, если вам действительно нравится ваш первоначальный дизайн, я бы выбрал :
ip a | awk '/inet / {print substr($2, 1, index($2,"/")-1)}'
или
ip a | awk '/inet / {split($2, addr, "/"); print addr[1]}'
В первой команде мы используем index($2, "/")
, чтобы найти, где /
находится в $2
, а затем используем substr
для создания подстроки. В секундах мы разделяем $2
на /
и сохраняем их в массиве addr
.
Вы можете заменить /
и следующие символы пустой строкой:
ip a | awk '/inet /{ sub(/\/.*/, "", $2); print $2 }'
ip a | awk '/inet / {FS="/"; $0=$2; print $1; FS=" "}'
Первая совпадающая запись разбивается на поля в соответствии с установленным по умолчаниюFS
(пробелом ). Затем устанавливается новый FS
. Когда мы подставляем $0=$2
, снова выполняется расщепление в соответствии с новым FS
. Теперь $1
содержит то, что нам нужно, мы это печатаем. Наконец, мы устанавливаем FS
для следующей совпадающей записи.
На самом деле разделитель полей, который вы определяете с помощью -F
, является регулярным выражением. Таким образом, следующая команда должна доставить:
ip a | awk -F'[ /]+' '/inet / {print $3}'