Windows 7 上虚拟环境返回 AssertionError

16 投票
14 回答
11114 浏览
提问于 2025-04-17 09:19

在Windows 7上使用virtualenv遇到麻烦。

我运行了:

virtualenv _testenv

它返回:

Traceback (most recent call last):
  File "C:\Python27\Scripts\virtualenv-script.py", line 9, in <module>
    load_entry_point('virtualenv==1.5.2', 'console_scripts', 'virtualenv')()
  File "C:\Python27\lib\site-packages\virtualenv.py", line 558, in main
    prompt=options.prompt)
  File "C:\Python27\lib\site-packages\virtualenv.py", line 647, in create_environment
    site_packages=site_packages, clear=clear))
  File "C:\Python27\lib\site-packages\virtualenv.py", line 771, in install_python
    copy_required_modules(home_dir)
  File "C:\Python27\lib\site-packages\virtualenv.py", line 725, in copy_required_modules
    dst_filename = change_prefix(filename, dst_prefix)
  File "C:\Python27\lib\site-packages\virtualenv.py", line 710, in change_prefix
    (filename, prefixes)
AssertionError: Filename c:\Python27\Lib\os.py does not start with any of these prefixes: ['C:\\Python27']

我有以下环境变量:

PYTHONHOME=C:\Python27
PYTHONPATH=c:\Python27;c:\Python27\Lib
PYTHONSTARTUP=C:\Users\Larry\.pythonrc
PATH=%PYTHONHOME%\;%PYTHONHOME%\Scripts;etc

安装了ActiveState Python:

ActivePython 2.7.2.5 (ActiveState Software Inc.) based on
Python 2.7.2 (default, Jun 24 2011, 12:21:10) [MSC v.1500 32 bit (Intel)] on win32

我更新了PYTHONPATH=C:\Python27;C:\Python27\Lib。仍在寻找解决方案时,我发现并删除了AppData/Python*。重新安装了Python,现在出现了不同的错误:

C:\xbz>virtualenv _t
PYTHONHOME is set.  You *must* activate the virtualenv before using it
Overwriting _t\Lib\site.py with new content
New python executable in _t\Scripts\python2.7.exe
Not overwriting existing python script _t\Scripts\python.exe (you must use _t\Scripts\python2.7.exe)
Overwriting _t\Lib\distutils\__init__.py with new content
Installing setuptools..............
  Complete output from command C:\xbz\_t\Scripts\python2.7.exe -c "#!python
\"\"\"Bootstrap setuptoo...


" --always-copy -U setuptools:
  Traceback (most recent call last):
  File "<string>", line 278, in <module>
  File "<string>", line 210, in main
  File "<string>", line 132, in download_setuptools
  File "C:\Python27\Lib\urllib2.py", line 94, in <module>
    import httplib
  File "C:\Python27\Lib\httplib.py", line 71, in <module>
    import socket
  File "C:\Python27\Lib\socket.py", line 47, in <module>
    import _socket
ImportError: No module named _socket
----------------------------------------
...Installing setuptools...done.
Traceback (most recent call last):
  File "C:\Python27\Scripts\virtualenv-script.py", line 9, in <module>
    load_entry_point('virtualenv==1.5.2', 'console_scripts', 'virtualenv')()
  File "C:\Python27\lib\site-packages\virtualenv.py", line 558, in main
    prompt=options.prompt)
  File "C:\Python27\lib\site-packages\virtualenv.py", line 654, in create_environment
    install_setuptools(py_executable, unzip=unzip_setuptools)
  File "C:\Python27\lib\site-packages\virtualenv.py", line 384, in install_setuptools
    _install_req(py_executable, unzip)
  File "C:\Python27\lib\site-packages\virtualenv.py", line 360, in _install_req
    cwd=cwd)
  File "C:\Python27\lib\site-packages\virtualenv.py", line 624, in call_subprocess
    % (cmd_desc, proc.returncode))
OSError: Command C:\xbz\_t\Scripts\python2.7.exe -c "#!python
\"\"\"Bootstrap setuptoo...




" --always-copy -U setuptools failed with error code 1

我修改了Lib/socket.py并插入了:

import sys
sys.path = ['', 'C:\\Python27\\lib\\site-packages\\dotcloud-0.3.1-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\dotcloud.cli-0.3.1-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\flask-0.7dev_20110622-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\werkzeug-0.6.2-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\gunicorn-0.12.2-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\wtforms-0.6.3-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\repoze.browserid-0.3-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\paste-1.7.5.1-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\django_pjax-1.0-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\paramiko-1.7.7.1-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\pycrypto-2.4.1-py2.7-win32.egg', 'C:\\Python27', 'C:\\Python27\\Lib', 'C:\\Windows\\system32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27\\lib\\site-packages', 'C:\\Python27\\lib\\site-packages\\PIL', 'C:\\Python27\\lib\\site-packages\\win32', 'C:\\Python27\\lib\\site-packages\\win32\\lib', 'C:\\Python27\\lib\\site-packages\\Pythonwin', 'C:\\Python27\\lib\\site-packages\\setuptools-0.6c11-py2.7.egg-info', 'C:\\Python27\\Scripts', 'C:\\Python27\\Lib\\site-packages\\django\\bin']

在上面

import _socket

原因是我能够直接从Python提示符导入socket!所以我把现有的路径搞得乱七八糟。我还没有确切找出是哪个目录让它正常工作。至少这能让其他人明白为什么我会遇到这个错误。

有什么想法?建议吗?谢谢。:)


我修改了Lib/socket.py并插入了:

import sys
sys.path.append('C:\\Python27\\DLLs')

在上面

import _socket

14 个回答

5

现在有一个类似的问题,显示了错误:

AssertionError: Filename C:\Python27\Lib\os.py does not start with any of 
these prefixes: ['C:\\python27']

问题的不同之处在于'C:\python27'是小写的。所以这个问题表现为你无法安装新的虚拟环境,或者无法创建嵌套的虚拟环境(我们有时会这样做来进行测试)。问题的根源在于PYTHONPATH的内容。

PYTHONPATH=C:\Python27;C:\Python27\Lib

出于某种原因,virtualenv.py中的sys.path会返回c:\python27,但所需模块的路径会来自PYTHONPATH,并以'C:\Python27\Lib'开头,因此出现了断言错误。

简单来说,只需取消设置PYTHONPATH

13

试着把 PYTHONPATH 设置成 PYTHONPATH=C:\Python27;C:\Python27\Lib(开头的 C 要大写)。

你可以在命令提示符下输入 set PYTHONPATH=C:\Python27;C:\Python27\Lib 来完成这个设置。

不过要注意,一旦你关闭这个命令提示符窗口,PYTHONPATH 就会恢复到之前的状态。

31

这个问题虽然已经有三年了,但希望这个回答能对某些人有所帮助。与其设置环境变量(对我来说这个方法神秘地没用),你可以在创建虚拟环境时直接指定你的Python安装路径。在Windows系统中,你需要指向python.exe这个文件,而在Linux或Mac系统中,你只需要指向那个文件夹就可以了。以下是一些例子:

Windows:

virtualenv -p <PATH TO PYTHON.EXE> venv

Linux/Mac:

virtualenv -p </user/path/to/python> venv

这两种方法都会在当前目录下创建一个名为"venv"的子文件夹,用来存放虚拟环境。

撰写回答