如何在Ubuntu上创建一个使用Python3.3的虚拟环境?

我正在运行的是Precise Pangolin amd64系统。我从ppa:fkrull/deadsnakes安装了Python 3.3。
现在我想在虚拟环境中实际使用这个新版本的Python。但是,我该如何做呢?我遇到了以下错误:
$ virtualenv --no-site-packages --distribute -p /usr/bin/python3.3 ~/.virtualenvs/pywork3
Running virtualenv with interpreter /usr/bin/python3.3
The --no-site-packages flag is deprecated; it is now the default behavior.
New python executable in /home2/USERNAME/.virtualenvs/pywork3/bin/python3.3
Also creating executable in /home2/USERNAME/.virtualenvs/pywork3/bin/python
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/site.py", line 73, in <module>
    __boot()
  File "/usr/local/lib/python2.7/site-packages/site.py", line 2, in __boot
    import sys, imp, os, os.path   
ImportError: No module named 'imp'
ERROR: The executable /home2/USERNAME/.virtualenvs/pywork3/bin/python3.3 is not functioning
ERROR: It thinks sys.prefix is '/home2/USERNAME/.virtualenvs' (should be '/home2/USERNAME/.virtualenvs/pywork3')
ERROR: virtualenv is not compatible with this system or executable

如果我明确使用python3.3来调用virtualenv,我会得到这个错误:
$ python3.3 /usr/bin/virtualenv --no-site-packages --distribute -p /usr/bin/python3.3 ~/.virtualenvs/pywork3
Traceback (most recent call last):
  File "/usr/bin/virtualenv", line 2, in <module>
    import virtualenv
ImportError: No module named 'virtualenv'

我卡住了。非常感谢任何帮助!编辑:根据@thefourtheye的建议,我清理了本地的site-packages目录(实际上只删除了site.py)。现在我又前进了一步,但是virtualenv抱怨缺少easy_install。
 Error [Errno 2] No such file or directory:   
'/home2/USERNAME/.virtualenvs/pywork3/bin/easy_install' while executing command    
/home2/USERNAME/.virt...rk3/bin/easy_install /usr/share/python-virtualenv/pip-1.1.tar.gz

我安装了python3-setuptools包,它安装了easy_install的Py3版本。 编辑2: 这是详细输出,没有明确传递--distribute--no-site-packages,因为这两个开关是我的virtualenv的默认行为。
$ virtualenv --verbose -p /usr/bin/python3.3 ~/.virtualenvs/pywork3
Running virtualenv with interpreter /usr/bin/python3.3
Creating /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3
Symlinking Python bootstrap modules
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/config-3.3m
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/lib-dynload
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/os.py
  Ignoring built-in bootstrap module: posix
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/posixpath.py
  Cannot import bootstrap module: nt
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/ntpath.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/genericpath.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/fnmatch.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/locale.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/encodings
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/codecs.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/stat.py
  Cannot import bootstrap module: UserDict
  Cannot import bootstrap module: copy_reg
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/types.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/re.py
  Cannot import bootstrap module: sre
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/sre_parse.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/sre_constants.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/sre_compile.py
  Ignoring built-in bootstrap module: zlib
  Cannot import bootstrap module: _abcoll
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/warnings.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/linecache.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/abc.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/io.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/_weakrefset.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/copyreg.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/tempfile.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/random.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/__future__.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/collections
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/keyword.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/tarfile.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/shutil.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/struct.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/copy.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/base64.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/bisect.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/_dummy_thread.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/hashlib.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/heapq.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/hmac.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/reprlib.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/rlcompleter.py
  Symlinking /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/weakref.py
Creating /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/site-packages
Writing /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/site.py
Writing /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/orig-prefix.txt
Writing /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/no-global-site-packages.txt
Creating parent directories for /home2/USERNAME/.virtualenvs/pywork3/include
Symlinking /home2/USERNAME/.virtualenvs/pywork3/include/python3.3m
Creating /home2/USERNAME/.virtualenvs/pywork3/bin
New python executable in /home2/USERNAME/.virtualenvs/pywork3/bin/python3.3
Changed mode of /home2/USERNAME/.virtualenvs/pywork3/bin/python3.3 to 0o755
Also creating executable in /home2/USERNAME/.virtualenvs/pywork3/bin/python
Changed mode of /home2/USERNAME/.virtualenvs/pywork3/bin/python to 0o755
Testing executable with /home2/USERNAME/.virtualenvs/pywork3/bin/python3.3 -c "
import sys
prefix = sys.prefix
if sys.version_info[0] == 3:
    prefix = prefix.encode('utf8')
if hasattr(sys.stdout, 'detach'):
    sys.stdout = sys.stdout.detach()
elif hasattr(sys.stdout, 'buffer'):
    sys.stdout = sys.stdout.buffer
sys.stdout.write(prefix)
"
Got sys.prefix result: '/home2/USERNAME/.virtualenvs/pywork3'
Creating /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/distutils
Writing /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/distutils/__init__.py
Writing /home2/USERNAME/.virtualenvs/pywork3/lib/python3.3/distutils/distutils.cfg
Using existing distribute egg: /usr/share/python-virtualenv/distribute-0.6.24.tar.gz
Installing distribute..............................................................................................................................................................................................................................................................................................................................................................................................................done.
Installing existing pip-1.1.tar.gz distribution: /usr/share/python-virtualenv/pip-1.1.tar.gz
Installing pip...
  Error [Errno 2] No such file or directory: '/home2/USERNAME/.virtualenvs/pywork3/bin/easy_install' while executing command /home2/USERNAME/.virt...rk3/bin/easy_install /usr/share/python-virtualenv/pip-1.1.tar.gz
...Installing pip...done.
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 2283, in <module>
    main()
  File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 938, in main
    never_download=options.never_download)
  File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 1054, in create_environment
    install_pip(py_executable, search_dirs=search_dirs, never_download=never_download)
  File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 643, in install_pip
    filter_stdout=_filter_setup)
  File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 976, in call_subprocess
    cwd=cwd, env=env)
  File "/usr/lib/python3.3/subprocess.py", line 818, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.3/subprocess.py", line 1416, in _execute_child
    raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: '/home2/USERNAME/.virtualenvs/pywork3/bin/easy_install'

为了清楚起见,你可以尝试一下这个命令(不包括 distribute):virtualenv --no-site-packages -p /usr/bin/python3.3 ~/.virtualenvs/pywork3 - don.joey
我也尝试了使用 --setuptools,结果完全相同(包括安装 distribute)。 - andreas-h
在14.04版本中,一切都运行得非常顺利。 - Antti Haapala
7个回答

Python 3.3内置了venv。

http://docs.python.org/3/library/venv.html#module-venv

简单运行
pyvenv-3.3 /path/to/environment

然后激活它

source /path/to/environment/bin/activate

这个内置版本的virtualenv比你通常使用的要灵活得多。例如,你可以扩展EnvBuilder来做几乎任何你想做的事情。你可以从下面的链接中复制一个EnvBuilder的示例实现并进行调试: http://docs.python.org/3/library/venv.html#an-example-of-extending-envbuilder

上述脚本很可能已经包含了我们期望从virtualenv中获得的大部分功能。所以如果你只需要一个带有easy_install和pip的虚拟环境,你应该可以开始使用了。

如果你还是困惑如何操作,请参考@MarkOfSine的编辑下面的说明。


补充以上内容,根据文档:
例如,在执行以下命令后:pyvenv-3.3 /path/to/my_project/venv
您可以运行distribute_setup.py,它似乎会执行各种操作,但最终会在./my_project/venv/bin目录下得到easy_install
然后,您可以使用这个工具来安装pip等软件包。

文档并未说明从何处获取distribute_setup.py,因此我从以下位置下载:

http://python-distribute.org/distribute_setup.py

使用已激活的环境:
cd /path/to/my_project
source venv/bin/activate

跑:

python distribute_setup.py

easy_install pip

然后完成了与Python 2.x上的virtualenv更加一致的虚拟环境设置。

2不错的一点 - 我之前并不知道这个... - andreas-h
1实际上,这似乎不是一个"真正的"virtualenv。在激活后,既没有pip也没有easy_install可用。 - andreas-h
你需要自己安装那些。这并不意味着它不是“真实”的。 - Chris
1@andreas-h 另外,它的设计使您可以创建一个脚本来自行添加任何内容。请参阅http://docs.python.org/3/library/venv.html#an-example-of-extending-envbuilder - Chris
当你的终端在安装pip时不断报错权限错误时,请检查是否使用了正确的easy_install二进制文件。你可以通过./venv/bin/easy_install pip在虚拟环境中显式地选择二进制文件。 - OrangeTux

这比看起来的要容易:
virtualenv -p /usr/bin/python3 yourenv
source yourenv/bin/activate
pip install package-name

真的有效 :)

5应该是正确的答案。 - micgeronimo
是的!那真是太容易了!谢谢,伙计。@Cem Yildiz - Fahad Ahammed

  1. 备份site-packages文件夹。
  2. cp -r /usr/local/lib/python2.7/site-packages/ /tmp/site-packages

  3. 清空该目录。
  4. rm -rf /usr/local/lib/python2.7/site-packages/

  5. 现在尝试相同操作。
  6. virtualenv --no-site-packages --distribute -p /usr/bin/python3.3 ~/.virtualenvs/pywork3

  7. 安装时不使用pip。
  8. virtualenv --no-site-packages --distribute -p /usr/bin/python3.3 ~/.virtualenvs/pywork3 --no-pip

编辑:看起来virtualenv(1.7.1.2)和python3.3版本不兼容。因此,请尝试以下操作。
  1. 使用 sudo apt-get remove python-virtualenv 卸载 python-virtualenv。

  2. wget http://peak.telecommunity.com/dist/ez_setup.py; sudo python ez_setup.py 这将安装最新的 easy_install。

  3. sudo easy_install pip

  4. sudo pip install virtualenv

  5. virtualenv --no-site-packages --distribute -p /usr/bin/python3.3 ~/.virtualenvs/pywork3


有趣,现在我正在向前迈进一步,但还没有完全到达目标。请查看我的更新问题。 - andreas-h
我正在查看virtualenv的代码。如果你能执行相同的命令并增加详细输出,显示完整的结果,那将非常有帮助。virtualenv --no-site-packages --distribute -p /usr/bin/python3.3 ~/.virtualenvs/pywork3 --verbose - thefourtheye
明白了,请看我更新的问题。 - andreas-h
已经分析了两个多小时。看起来distribute没有在bin目录中安装easy_install脚本。我们可以稍后手动安装它们。所以只需安装virtualenv,尝试不使用pip安装,如我在答案中更新的那样。 - thefourtheye
非常感谢您的努力!不幸的是,我遇到了virtualenv: error: no such option: --no-pip的问题。我的virtualenv版本是1.7.1.2,并且我是通过sudo apt-get install python-virtualenv进行安装的。 - andreas-h
抱歉,我成功复现了您所遇到的错误信息。首先,请使用以下命令卸载python-virtualenv:sudo apt-get remove python-virtualenv然后执行以下命令来安装最新的easy_install:wget http://peak.telecommunity.com/dist/ez_setup.py; sudo python ez_setup.py接下来,执行以下命令安装pip:sudo easy_install pip然后执行以下命令安装virtualenv:sudo pip install virtualenv最后,执行以下命令创建一个没有系统包依赖、使用Python 3.3的虚拟环境,并将其存储在~/.virtualenvs/pywork3目录中:virtualenv --no-site-packages --distribute -p /usr/bin/python3.3 ~/.virtualenvs/pywork3 - thefourtheye
1不用手动安装virtualenv,我只是从http://packages.ubuntu.com/raring/all/python-virtualenv/download下载了Ubuntu Raring的.dev包,并通过dpkg -i命令进行了安装。现在看起来好像可以工作了。非常感谢! - andreas-h
可能对一些人来说会感兴趣的是,virtualenv已经弃用了--no-site-packages选项,并且默认情况下无法访问全局site-packages。 - Hemm
我可以用它来创建一个Python 2的虚拟环境吗?(开个玩笑!)(不过说真的!) - John Mee
两年后,Linux发行版已经更新了其软件包仓库,所以无需安装软件包。同时--no-site-packages--distribute选项已被弃用,不再起作用。只需运行virtualenv <name> -p /usr/bin/python3即可完成任务。 - Eloims

你做得太复杂了。如果它已经包含在python3中,只需用冒号创建它即可。
python3 -m venv

您甚至可以创建一个别名,如果您愿意的话。
alias virtualenv3='python3 -m venv'

根据不同的机器,你可能需要指定解释器。
alias virtualenv3='python3 -m venv -p python3'

1在Ubuntu 14.04上,至少需要安装python3-venv软件包。 - gioele
对我来说(还有在14.04上),该软件包被称为python3.4-venv - tobek
在版本18.04上,也是如此。 - fanny

适用于我的步骤: 在MAC OSX 10.9.5上
  1. 下载并手动安装Python-3.4.3

    P3PATH=/Users/$USER/Python3
    mkdir -p $P3PATH
    cd $P3PATH
    tar -zxvf Python-3.4.3.tgz
    ./configure --prefix=$P3PATH/Python-3.4.3
    make; make install
    
  2. 创建一个虚拟环境。

    $P3PATH/Python-3.4.3/bin/pyvenv py3env
    source py3env/bin/activate
    
请注意:
virtualenv -p <python3的路径> py3env 无效。
Error due to zlib

这在Debian 7(wheezy)上也可以正常工作。只是另一条P3PATH。 - rubo77
对于基于Debian的容器用户,请确保安装libssl-devzlib1g-dev,以便使用_ssl.so和zlib.so编译Python。 - Nehal J Wani

On Ubuntu 14.04 

sudo apt-get install python3-pip

sudo pip install virtualenv

virtualenv-3.4 --no-site-packages venv

只需确保您已安装pipvenv

sudo apt install python3-pip
sudo apt install python3-venv

然后你可以像这样使用它:
python3 -m venv ~/env-sample
. ~/env-sample/bin/activate