Вы можете сделать это, не устанавливая ничего в сам Python.
Вам не нужны sudo или какие-либо привилегии.
Вам не нужно находить последнюю версию virtualenv
tar-файла
Вам не нужно редактировать информацию о версии в bash-скрипте, чтобы поддерживать работуна сегодняшний день.
Вам не нужно устанавливать curl
/ wget
или tar
, а также pip
или easy_install
это работает для 2.7, а также для 3.X
Сохраните следующее в /tmp/initvenv.py
:
из future импортируйте print_function
import os, sys, shutil, tempfile, subprocess, tarfile, hashlib
try:
from urllib2 import urlopen
except ImportError:
from urllib.request import urlopen
tmp_dir = tempfile.mkdtemp(prefix='initvenv_')
try:
# read the latest version from PyPI
f = urlopen("https://pypi.python.org/pypi/virtualenv/")
# retrieve the .tar.gz file
tar_found = False
url = None
sha256 = None
for line in f.read().splitlines():
if isinstance(line, bytes):
line = line.decode('utf-8')
if tar_found:
if 'sha256' in line:
sha256 = line.split('data-clipboard-text')[1].split('"')[1]
break
continue
if not tar_found and 'tar.gz">' not in line:
continue
tar_found = True
for url in line.split('"'):
if url.startswith('https'):
break
else:
print('tar.gz not found')
sys.exit(1)
file_name = url.rsplit('/', 1)[1]
print(file_name)
os.chdir(tmp_dir)
data = urlopen(url).read()
data_sha256 = hashlib.sha256(data).hexdigest()
if sha256 != data_sha256:
print('sha256 not correct')
print(sha256)
print(data_sha256)
sys.exit(1)
with open(file_name, 'wb') as fp:
fp.write(data)
tar = tarfile.open(file_name)
tar.extractall()
tar.close()
os.chdir(file_name.replace('.tar.gz', ''))
print(subprocess.check_output([sys.executable, 'virtualenv.py'] +
[sys.argv[1]]).decode('utf-8'), end='')
if len(sys.argv) > 2:
print(subprocess.check_output([
os.path.join(sys.argv[1], 'bin', 'pip'), 'install', 'virtualenv'] +
sys.argv[2:]).decode('utf-8'), end='')
except:
raise
finally:
shutil.rmtree(tmp_dir) # always clean up
и используйте его как
python_binary_to_use_in_venv /tmp/initvenv.py your_venv_name [optional packages]
например (если вам действительно нужен distribute
слой совместимости для setuptools
)
python /tmp/initvenv.py venv distribute
Обратите внимание, что в более старых версиях Python это может дать вам InsecurePlatformWarning
s¹.
Когда у вас есть свой virtualenv (имя, например, venv
), вы можете настроить другой virtualenv с помощью только что установленного virtualenv
:
venv/bin/virtualenv venv2
virtualenvwrapper
Я рекомендуювзгляните также на virtualenvwrapper , после однократной настройки:
% /opt/python/2.7.10/bin/python /tmp/initvenv.py venv virtualenvwrapper
и активации (можно сделать из сценария входа в систему):
% source venv/bin/virtualenvwrapper.sh
Вы можете делать такие вещи, как:
% mktmpenv
New python executable in tmp-17bdc3054a46b2b/bin/python
Installing setuptools, pip, wheel...done.
This is a temporary environment. It will be deleted when you run 'deactivate'.
(tmp-17bdc3054a46b2b)%
¹ Я не нашел способ подавить предупреждение.Это может быть решено в pip
и / или request
, но разработчики указывают друг на друга как на причину.Я получил, часто нереалистичную, рекомендацию обновить версию Python, которую я использовал, до последней версии.Я уверен, что это сломает, например, мою установку Linux Mint 17.К счастью, pip
кэширует пакеты, поэтому предупреждение делается только один раз за установку пакета.