Windows 7 上虚拟环境返回 AssertionError
在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 个回答
现在有一个类似的问题,显示了错误:
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。
试着把 PYTHONPATH
设置成 PYTHONPATH=C:\Python27;C:\Python27\Lib
(开头的 C 要大写)。
你可以在命令提示符下输入 set PYTHONPATH=C:\Python27;C:\Python27\Lib
来完成这个设置。
不过要注意,一旦你关闭这个命令提示符窗口,PYTHONPATH
就会恢复到之前的状态。
这个问题虽然已经有三年了,但希望这个回答能对某些人有所帮助。与其设置环境变量(对我来说这个方法神秘地没用),你可以在创建虚拟环境时直接指定你的Python安装路径。在Windows系统中,你需要指向python.exe这个文件,而在Linux或Mac系统中,你只需要指向那个文件夹就可以了。以下是一些例子:
Windows:
virtualenv -p <PATH TO PYTHON.EXE> venv
Linux/Mac:
virtualenv -p </user/path/to/python> venv
这两种方法都会在当前目录下创建一个名为"venv"的子文件夹,用来存放虚拟环境。