#python #django #virtualenv
#python #django #virtualenv
Вопрос:
Я пытаюсь настроить virtualenv в Ubuntu 10.04 с помощью Python 2.6.5, но у меня возникли некоторые проблемы.
После установки virtualenv и virtualenv wrapper с помощью pip я запускаю команду: virtualenv mysite-env —verbose
Я получаю следующую ошибку:
Creating mysite-env/lib/python2.6
Symlinking Python bootstrap modules
Symlinking mysite-env/lib/python2.6/lib-dynload
Symlinking mysite-env/lib/python2.6/config
Symlinking mysite-env/lib/python2.6/os.py
Ignoring built-in bootstrap module: posix
Symlinking mysite-env/lib/python2.6/posixpath.py
Cannot import bootstrap module: nt
Symlinking mysite-env/lib/python2.6/ntpath.py
Symlinking mysite-env/lib/python2.6/genericpath.py
Symlinking mysite-env/lib/python2.6/fnmatch.py
Symlinking mysite-env/lib/python2.6/locale.py
Symlinking mysite-env/lib/python2.6/encodings
Symlinking mysite-env/lib/python2.6/codecs.py
Symlinking mysite-env/lib/python2.6/stat.py
Symlinking mysite-env/lib/python2.6/UserDict.py
Symlinking mysite-env/lib/python2.6/lib-dynload/readline.so
Symlinking failed, copying to mysite-env/lib/python2.6/lib-dynload/readline.so
Traceback (most recent call last):
File "/usr/local/bin/virtualenv", line 9, in <module>
load_entry_point('virtualenv==1.6.1', 'console_scripts', 'virtualenv')()
File "/usr/local/lib/python2.6/dist-packages/virtualenv.py", line 795, in main
never_download=options.never_download)
File "/usr/local/lib/python2.6/dist-packages/virtualenv.py", line 886, in create_environment
site_packages=site_packages, clear=clear))
File "/usr/local/lib/python2.6/dist-packages/virtualenv.py", line 1020, in install_python
copy_required_modules(home_dir)
File "/usr/local/lib/python2.6/dist-packages/virtualenv.py", line 974, in copy_required_modules
copyfile(filename, dst_filename)
File "/usr/local/lib/python2.6/dist-packages/virtualenv.py", line 414, in copyfile
copyfileordir(src, dest)
File "/usr/local/lib/python2.6/dist-packages/virtualenv.py", line 391, in copyfileordir
shutil.copy2(src, dest)
File "/usr/lib/python2.6/shutil.py", line 99, in copy2
copyfile(src, dst)
File "/usr/lib/python2.6/shutil.py", line 53, in copyfile
fdst = open(dst, 'wb')
IOError: [Errno 20] Not a directory: 'mysite-env/lib/python2.6/lib-dynload/readline.so'
Если я запущу его снова, я получу следующее:
Directory mysite-env/lib/python2.6 already exists
Symlinking Python bootstrap modules
Ignoring built-in bootstrap module: posix
Cannot import bootstrap module: nt
Symlinking mysite-env/lib/python2.6/lib-dynload/readline.so
Symlinking mysite-env/lib/python2.6/copy_reg.py
Symlinking mysite-env/lib/python2.6/types.py
Symlinking mysite-env/lib/python2.6/re.py
Symlinking mysite-env/lib/python2.6/sre.py
Symlinking mysite-env/lib/python2.6/sre_parse.py
Symlinking mysite-env/lib/python2.6/sre_constants.py
Symlinking mysite-env/lib/python2.6/sre_compile.py
Ignoring built-in bootstrap module: zlib
Symlinking mysite-env/lib/python2.6/warnings.py
Symlinking mysite-env/lib/python2.6/linecache.py
Symlinking mysite-env/lib/python2.6/_abcoll.py
Symlinking mysite-env/lib/python2.6/abc.py
Creating mysite-env/lib/python2.6/site-packages
Writing mysite-env/lib/python2.6/site.py
Writing mysite-env/lib/python2.6/orig-prefix.txt
Creating parent directories for mysite-env/include
Symlinking mysite-env/include/python2.6
Creating mysite-env/bin
New python executable in mysite-env/bin/python
Changed mode of mysite-env/bin/python to 0755
Testing executable with mysite-env/bin/python -c "import sys; print(sys.prefix)"
ERROR: The executable mysite-env/bin/python is not functioning
ERROR: It thinks sys.prefix is u'/usr' (should be '/vagrant/mysite-env')
ERROR: virtualenv is not compatible with this system or executable
Есть идеи, как это исправить? Спасибо!
Комментарии:
1. Спасибо за публикацию этого. Это совершенно сбило меня с толку, когда я пытался настроить reviewboard на vagrant. Теперь, когда у меня есть / var / www в качестве каталога, все сработало отлично!
Ответ №1:
Похоже, прошло немного времени с тех пор, как вы спросили об этом. Файловый драйвер Virtualbox для каталога / vagrant не может распознавать символические ссылки, которые часто использует virtualenv.
Это лучше всего продемонстрировать с помощью простого
mybox:/vagrant$ ln -s ~/.bashrc
ln: failed to create symbolic link ./.bashrc': Protocol error`
Обновить:
Из-за несовместимости vagrant с символическими ссылками и virtualenv мои ящики / экземпляры vagrant зависели от конкретной задачи / проекта (только 1 virtualenv). Итак, в папке vagrant на стороне хоста / экземпляра я бы сохранил короткий скрипт для установки python amp; virtualenv, затем выполнил
pip install -r /vagrant/requirement
Дополнительную документацию можно найти здесь. https://docs.vagrantup.com/v2/provisioning/basic_usage.html
с помощью соответствующих проверок bash if
(существует ли python, существует ли / home / vagrant / env ) вы можете один раз подготовить свой ящик, а затем добавить вызов для активации вашей установки ~ / env, чтобы при входе в систему ваша установка была уже настроена и готова к работе.
Комментарии:
1. Каково решение для этого?
2. Я так немногословен на мобильном телефоне. для систем vagrant лучше всего создать файл требований к pip и поместить ваш виртуальный env в домашний каталог. вы можете использовать флаг кэширования pips для хранения в вашем общем каталоге vagrant, но не в самом venv
3. орфографическая ошибка — не используйте jeep, локальное кэширование может быть сохранено в
/vagrant/py_fast
или лучше в общий каталог pip.readthedocs.org/en/latest / … так что, если вам нужно уничтожить / перестроить, вы можете отключить pypi для всего, кроме обновлений (реальность такова, что вы не будете часто обновляться, если у вас есть файл требований).
Ответ №2:
Эта ошибка возникает из-за virtualenv.py используемый вами файл несовместим с используемой вами версией Python.. Для python2.7 вам нужно удалить двоичные файлы из virtualenv.org сайт, а затем скомпилировать их с помощью
python setup.py install
после установки используйте установленный двоичный файл (не virtualenv.py файл) для создания виртуальной среды с помощью
virtualenv --no-site-packages <path to virtual env directory>/env/
Ответ №3:
У этой проблемы уже есть несколько ответов, но я хочу поделиться своим решением, на случай, если оно поможет следующему пользователю.
Имеет значение, где я запускаю команду. Я запускал команду virtualenv env внутри общей папки / vagrant. Это была моя ошибка. Когда я возвращаюсь на свой домашний каталог, затем запускаю virtualenv env, все работает нормально.
Комментарии:
1. Как вы гарантируете, что ваше приложение на Python, расположенное по адресу / vagrant, использует виртуальную среду в вашем домашнем каталоге? Я пытаюсь заставить tox искать в моем каталоге / home / vagrant / env при запуске из каталога / vagrant
2. Я запускаю «source ~ /venv_name/bin/activate», Код приложения находится в «/vagrant / webapps /app_name», я никогда не использовал tox, но это или я думаю, вы можете просто .. / .. / пока не окажетесь там?
Ответ №4:
Я не сталкивался с этой конкретной проблемой, но я лично переключился с использования virtualenv
на pythonbrew
. pythonbrew
это другое решение той же проблемы; оно работает больше как rvm
в сообществе Ruby: оно создает полностью автономные версии Python с нуля под $HOME/.pythonbrew
; затем оно предоставляет функции оболочки, которые позволяют вам легко переключаться с одной на другую (редактируя путь для вас и т.д.). Это не так просто, как virtualenv
, Но это также не привязка к системному Python, поэтому проблема с символическими ссылками полностью устраняется. Вы также можете установить несколько версий Python, даже если они не установлены в базовой системе.
Конечно, ваш пробег может отличаться, но pythonbrew
у меня все работает хорошо.
Комментарии:
1. Обратите внимание, что вы можете использовать virtualenv для любой версии Python, которая установлена в системе, и вы можете игнорировать общесистемные пакеты сайта с помощью —not-site-packages. В сочетании с virtualenvwrapper это становится довольно чистым и опрятным. Хотя Брайан прав, pythonbrew может позволить вам установить версию python, которой изначально там не было.
2. Согласен. Я не имел в виду, что virtualenv не может создавать среды для нескольких версий Python; я делал это постоянно. Но это фундаментально связано с тем, что уже есть в системе, в то время как pythonbrew — нет. Каждый подход имеет свои преимущества и недостатки. В наши дни я предпочитаю pythonbrew. YMMV.