Virtualenv на Ubuntu без сайтов-пакетов
-
05-07-2019 - |
Вопрос
В последнее время я использую virtualenv при разработке на python. Мне нравится идея отдельной среды разработки с использованием опции --no-site-packages, но сделать это при разработке приложения PyGTK может быть немного сложно. Модули PyGTK установлены в Ubuntu по умолчанию, и я хотел бы, чтобы virtualenv (с --no-site-packages) знал о конкретных модулях, которые расположены в других местах системы.
Какой лучший способ сделать это? Или мне просто смириться с этим и отбросить опцию --no-site-packages?
Решение
$ virtualenv --no-site-packages --python=/usr/bin/python2.6 myvirtualenv
$ cd myvirtualenv
$ source bin/activate
$ cd lib/python2.6/
$ ln -s /usr/lib/pymodules/python2.6/gtk-2.0/
$ ln -s /usr/lib/pymodules/python2.6/pygtk.pth
$ ln -s /usr/lib/pymodules/python2.6/pygtk.py
$ ln -s /usr/lib/pymodules/python2.6/cairo/
$ python
>>> import pygtk
>>> import gtk
Другие советы
Один из способов - добавить пути к вашему коду с помощью sys.path.
import sys
sys.path.append(somepath)
Другой способ - использовать сайт, который обрабатывает файлы .pth в дополнение к добавлению в sys.path.
import site
site.addsitedir(sitedir, known_paths=None)
https://docs.python.org/library/site.html р>
Но вы, вероятно, не хотите добавлять это ко всему связанному коду. Р>
Я видел упоминание о том, что sitecustomize.py используется для выполнения чего-то подобного, но после некоторого тестирования я не смог заставить его работать так, как можно было ожидать. Р>
Здесь упоминается, что автоматический импорт sitecustomize.py завершился в 2.5, если вы не в 2.5, попробуйте. (просто добавьте один из указанных выше способов добавления в файл и поместите его в каталог, в котором запускается ваша программа) Обходной метод упоминается в посте для пользователей от 2.5 и выше. Р>
Я считаю, что в этой ситуации символические ссылки или даже копирование определенных файлов (пакетов, модулей, расширений) работает очень хорошо.
Это позволяет программе эмулировать работу в целевой среде, а не изменять приложение в соответствии со средой разработки.
То же самое для чего-то вроде AppEngine.
Посмотрите скрипт-ловушку postmkvirtualenv здесь:
https://stackoverflow.com/a/9716100/60247
В этом случае он использует его для импорта PyQt и SIP после создания нового Virtualenv, но вы можете добавить нужные вам пакеты в LIBS. Р>
И оцените этот сценарий, потому что он фантастический:)
Если вы хотите включить ссылки на Python gtk-2.0 соответствующей системы в virtualenv, вы можете просто использовать pip для установки ruamel.venvgtk :
pip install ruamel.venvgtk Вы ничего не импортируете, ссылки устанавливаются во время установки.
Это особенно удобно, если вы используете tox
, в этом случае вам нужно только включить зависимость (для tox):
deps:
pytest
ruamel.venvgtk
и во вновь настроенной среде python2.7 будут включены соответствующие ссылки перед запуском тестов.
Более подробную информацию о настройке ссылок можно найти в этом ответе