Определите, работает ли Ipython в виртуальной среде - PullRequest
0 голосов
/ 26 октября 2019

Я установил IPython глобально с помощью менеджера пакетов дистрибутива. Когда я запускаю его из виртуальной среды, я получаю сообщение UserWarning: Attempting to work in a virtualenv. …. Я пытался использовать методы, описанные florisla на . Определить, работает ли Python внутри virtualenv , чтобы выяснить, работает ли он правильно. Кусок кода, который я на самом деле выполняю, слегка модифицирован для вывода всех логических значений при запуске:

# 1) VIRTUAL_ENV environment variable
# Both 'virtualenv' and 'venv' set the environment variable '$VIRTUAL_ENV' when activating an environment. See PEP 405.
# You can read out this variable in shell scripts, or use this Python code to determine if it's set.
import os
running_in_virtualenv = "VIRTUAL_ENV" in os.environ
# alternative ways to write this, also supporting the case where
# the variable is set but contains an empty string to indicate
# 'not in a virtual environment':
running_in_virtualenv1a = bool(os.environ.get("VIRTUAL_ENV"))
running_in_virtualenv1b = bool(os.getenv("VIRTUAL_ENV"))
# The problem is, this only works when the environment is activated by the 'activate' shell script.
# You can start the environment's scripts without activating the environment, so if that is a concern, you have to use a different method.
print("1a:", running_in_virtualenv1a)
print("1b:", running_in_virtualenv1b)

# 2) sys.real_prefix and sys.base_prefix
# Virtualenv points 'sys.prefix' to the Python installed inside of the virtualenv as you would expect.
# At the same time, the original value of 'sys.prefix' is also made available as a new attribute of 'sys': 'sys.real_prefix'. This is what we're using to detect if we're in a virtualenv.
import sys
running_in_virtualenv = hasattr(sys, "real_prefix")
# There's a problem though: 'venv' and 'pyvenv' do this differently from 'virtualenv' -- they don't set 'real_prefix'. Instead, they set 'base_prefix' to a different value from 'sys.prefix'.
# So to be safe, check both as suggested in hroncok's answer:
import sys
virtualenv_prefix = getattr(sys, "real_prefix", None)
venv_prefix = getattr(sys, "base_prefix", sys.prefix)
running_in_virtualenv2 = virtualenv_prefix or venv_prefix != sys.prefix
print("2:", running_in_virtualenv2)

Теперь, если я запускаю этот код из-за пределов виртуальной среды, я получаю три False обас оболочкой python3 и ipython3, но если я нахожусь в виртуальной среде, IPython возвращает False для последнего логического значения (running_in_virtualenv2), тогда как python3 возвращает True для всех них.

Могу ли я по-прежнему возиться с моей виртуальной средой, используя IPython, без риска испортить установку системы?

1 Ответ

1 голос
/ 26 октября 2019

В основном виртуальная среда - это изменение пути поиска импорта.

import pprint
import sys

pprint.pprint(sys.path)

Проверьте path в разных средах и выберите элемент каталога, соответствующий вашему venv, например, каталог, который показываетпри вводе $ which python. Пусть ваш код изменит свое поведение в зависимости от наличия этого каталога.

...