设置Virtualenv时遇到问题

6

我正在尝试在Ubuntu 10.04上使用Python 2.6.5设置virtualenv,但遇到了一些问题。

在使用pip安装virtualenv和virtualenv wrapper之后,我运行以下命令: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

有什么方法可以解决这个问题吗?谢谢!

谢谢您发布这篇文章。在尝试在vagrant上设置reviewboard时,我遇到了很大的问题。现在我把/var/www作为目录,一切都运行良好! - Mike Caron
4个回答

5

看起来你提出这个问题已经有一段时间了。Virtualbox的文件驱动程序无法识别符号链接,而virtualenv经常使用/vagrant目录的驱动程序。

这可以通过一个简单的示例来最好地说明。

mybox:/vagrant$ ln -s ~/.bashrc
ln: failed to create symbolic link ./.bashrc': Protocol error`

更新:

由于vagrant与符号链接和虚拟环境不兼容,我的vagrant boxes/instances是任务/项目特定的(只有1个virtualenv)。因此,在vagrant host side/instance文件夹中,我会保留一个简短的脚本来安装python和virtualenv,然后执行以下操作:

pip install -r /vagrant/requirement

这里可以找到更多的文档。 https://docs.vagrantup.com/v2/provisioning/basic_usage.html

使用适当的bash if检查(如python是否存在,/home/vagrant/env是否存在),您可以在一次provision后附加调用以激活您的~/env安装,以便在登录时,您已经设置好并准备就绪。


这个问题有什么解决方案? - stephenmurdoch
我正在使用手机,所以简短地说。对于Vagrant系统,最好保留一个pip requirements文件,并将您的虚拟环境放在主目录下。您可以使用pip的缓存标志将其存储在Vagrant共享目录中,但不要存储venv本身。 - David
拼写错误 - 请保留原文的 "keep" 而非 "jeep",本地缓存可以保存到 /vagrant/py_fast 或更好的共享目录中 http://pip.readthedocs.org/en/latest/user_guide.html#fast-local-installs 这样,如果您需要销毁/重建系统,则可以从 pypi 中删除所有内容,但保留更新(实际上,如果您拥有 requirements 文件,则不会经常进行更新)。 - David

2

出现此错误是因为您正在使用的virtualenv.py文件与您正在使用的python版本不兼容。对于Python2.7,您需要从virtualenv.org网站下载二进制文件,然后使用编译器进行编译。

python setup.py install

在安装完成后,使用已安装的二进制文件(而不是virtualenv.py文件)通过以下方式创建虚拟环境:

virtualenv --no-site-packages <path to virtual env directory>/env/

1

这个问题已经有了几个答案,但是我想分享我的解决方案,以防对下一个人有所帮助。

在哪里运行命令很重要。我曾经在 /vagrant 共享文件夹内运行 virtualenv env 命令,这是我的错误。当我返回 HOME 目录后再运行 virtualenv env 命令,一切都正常工作。


你如何确保位于 /vagrant 的 Python 应用程序使用你主目录中的虚拟环境?我正在尝试让 tox 在 /vagrant 目录内运行时查找 /home/vagrant/env 目录。 - stephenmurdoch
我运行“source ~/venv_name/bin/activate”,应用程序代码位于“/vagrant/webapps/app_name”中。我从未使用过tox,但是我认为您只需使用“../../”即可到达那里。 - Anthony Roberts

0

我个人没有遇到过这个特定的问题,但我已经从使用virtualenv转换到pythonbrewpythonbrew是解决同样问题的不同方案;它更像Ruby社区中的rvm:它完全自包含地构建Python版本,从头开始,在$HOME/.pythonbrew下;然后,它提供了shell函数,允许您轻松地从一个版本切换到另一个版本(为您编辑路径等)。它不像virtualenv那么轻量级,但它也不依赖于系统Python,因此整个符号链接问题消失了。您还可以安装多个Python版本,即使它们没有安装在基本系统中。

当然,您的情况可能有所不同,但pythonbrew对我来说一直很好用。


1
请注意,您可以使用virtualenv来管理系统上已安装的任何Python版本,并且可以使用--not-site-packages忽略全局安装的软件包。与virtualenvwrapper配合使用,可以使其变得非常干净整洁。不过,Brian说得对,pythonbrew可以让您安装一个最初不存在的Python版本。 - Henry
同意。我并不是想暗示 virtualenv 不能为多个 Python 版本创建环境;我经常这样做。但它基本上与系统上已有的内容紧密相连,而 pythonbrew 则不然。每种方法都有其优点和缺点。现在,我更喜欢 pythonbrew。你的情况可能会有所不同。 - Brian Clapper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接