Проблема с настройкой Virtualenv

#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.