【问题标题】:virtualenv on windows 7 returns AssertionErrorWindows 7 上的 virtualenv 返回 AssertionError
【发布时间】:2012-01-31 02:27:04
【问题描述】:

在 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 提示符导入套接字!所以塞满了我现有的路径。我还没有确切地缩小哪个目录让它快乐。它至少会向其他人揭示为什么没有它我会收到错误。

想法?建议? 谢谢你。 :)


我破解了 Lib/socket.py 并插入:

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

以上

import _socket

【问题讨论】:

标签: python windows-7 virtualenv


【解决方案1】:

3 岁的问题,但希望这个答案仍然可以帮助某人。您可以在设置虚拟环境时将路径传递给 Python 安装,而不是设置环境变量(这对我来说神秘地不起作用)。在 Windows 中,您必须指向 python.exe 的路径,但在 Linux/OS X 中,您似乎只是指向该文件夹的路径。例子:

Windows:

virtualenv -p <PATH TO PYTHON.EXE> venv

Linux/Mac:

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

两者都在当前目录的子文件夹“venv”中创建一个虚拟环境。

【讨论】:

  • 非常感谢!这证明了如果您能提供一些东西,人们不应该回避回答老问题或有很多答案的问题。
【解决方案2】:

尝试将PYTHONPATH 设置为PYTHONPATH=C:\Python27;C:\Python27\Lib(以大写C开头)。

这可以通过在命令提示符下键入 set PYTHONPATH=C:\Python27;C:\Python27\Lib 来完成。

PYTHONPATH 将在命令提示符窗口关闭后恢复到以前的状态。

【讨论】:

  • 抱歉,这并没有帮助。 :(
  • 这次成功了。 :) 谢谢 :)
【解决方案3】:

目前有类似问题显示错误:

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

不同之处在于 'C:\python27' 是小写的。所以问题表现在你不能安装新的virtualenv或制作嵌套的virtualenvs(我们有时这样做是为了测试)。 原因在于 PYTHONPATH 的内容

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

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

长话短说,只需取消设置 PYTHONPATH

【讨论】:

  • 这帮助我解决了问题。对我的提示是路径看起来不错,但情况不同。
【解决方案4】:

对于 _socket 错误,将您的 pythonpython 路径更改为:

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

【讨论】:

    【解决方案5】:

    您可以尝试以下方法(假设您的 python 在全局路径中):

    python -m virtualenv [foldername]
    

    这对我有用,Win 10,virtualenv 15.1.0

    我从这个video 得到它,它会执行python lib 而不是调用windows exe。

    【讨论】:

      【解决方案6】:

      我已经添加了

      if is_win:    
              prefixes.append('C:\PYTHON27')    
      

      到 virtualenv.py 并且它可以工作。

      【讨论】:

        【解决方案7】:

        这很奇怪,但来自错误消息

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

        似乎,它希望文件 os.py 的路径名以大写“C”开头,并且前缀完整性检查区分大小写。

        由于库的路径源自PYTHONPATH,并且在您的情况下驱动器号为小写,因此将其更改为大写以解决问题似乎是合乎逻辑的。

        喜欢

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

        【讨论】:

        • 我遇到了同样的问题。重申一下,您必须查看错误消息并确保路径设置中所有字母的 /case/ 与错误消息匹配。此外,更改 PATH 设置后,您必须启动新的命令提示符才能使用新设置。
        【解决方案8】:

        我讨厌“总结”答案,但是当我刚刚遇到一个非常相似的问题时,我想我也会在这里发布我的解决方案,该解决方案来自其中的几个答案。

        断言错误是因为我没有PYTHONPATH 环境变量设置。

        套接字错误是因为我没有包含 PythonXX\DLLs 文件夹。

        完整的 PYTHONPATH 环境变量应如下所示:

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

        【讨论】:

          【解决方案9】:

          这是一个已经提交给 Python 开发团队的错误:https://github.com/pypa/virtualenv/pull/697

          与此同时,为什么不将 Python 安装文件夹名称更改为 (ptyhon27) 以使断言工作,或者如果您觉得更舒服,只需使用替代位置重新安装 python。它可以正常工作。

          【讨论】:

            【解决方案10】:

            我在 Windows 7 上也遇到了这个问题。我的 Python27 安装在 C:\Program Files 下,路径中显然包含一个空格。因此,在不包含 Python 的单独 Windows 7 系统上,我在 C:\Python27(默认安装路径)下重新安装了 Python27,然后安装了 setuptools(用于 easy_install)。

            之后,我能够在没有上述断言错误的情况下干净地安装 virtualenv(我使用了 easy_install)。

            我知道 OP 的系统已经在使用默认路径,但我想我会在这里添加我的经验,作为某些特定情况的可能解决方案。

            【讨论】:

              【解决方案11】:

              这个问题可能是其他更区分大小写的文件系统的遗留问题。

              完整的解决方案:

              1. 从 virtualenv 读取错误消息。记住它说“不以任何这些前缀开头的部分:['C:\\Python27']”。

              2. 编辑 PYTHONPATH,如果没有,则创建它(Start+Break、高级系统设置、环境变量)。除非您打算切换用户帐户,否则它是用户变量还是系统变量都没有关系。

              3. 使大小写与错误消息匹配。驱动器号和文件夹名称都必须匹配(如果您没有安装到 C:\Python27,大概也是中间文件夹)。你可以忽略双反斜杠,一个就可以了。

              我为修复该错误所做的唯一更改如下。更改应该对任何新的命令/终端会话生效(关闭您打开的 cmd.exe / powershell / 等窗口)。

              • 旧状态:PYTHONPATH = C:\PYTHON27;C:\PYTHON27\LIB;C:\PYTHON27\DLLS

              • 新状态:PYTHONPATH = C:\Python27;C:\Python27\LIB;C:\Python27\DLLS

              如果您的 PYTHONPATH 中有任何其他项目,您也可以更改这些项目,但它可能不会影响 virtualenv 的运行能力。

              【讨论】:

                【解决方案12】:

                更改 "virtualenv.py" --> 更改前缀为:

                def change_prefix(filename, dst_prefix):
                  ...
                 prefixes = sorted(prefixes, key=len, reverse=True)
                 filename = str(os.path.abspath(filename))[0].lower() + str(os.path.abspath(filename))[1:]
                 for src_prefix in prefixes:
                    if filename.startswith(src_prefix):
                        _, relpath = filename.split(src_prefix, 1)
                        if src_prefix != os.sep: # sys.prefix == "/"
                            assert relpath[0] == os.sep
                            relpath = relpath[1:]
                        return join(dst_prefix, relpath)
                 assert False, "Filename %s does not start with any of these prefixes: %s" % \
                    (filename, prefixes)
                
                  ...
                

                【讨论】:

                  【解决方案13】:

                  由于稍微不同的原因,我遇到了相同的断言错误。错误是does not start with any of these prefixes: ['C:\\python27'] 并注意小写“p”。实际的文件夹名称都使用大写-P Python27。 PTYHONPATH 中的所有前缀都是正确的。但是我输入了 PYTHONHOME 变量为C:\python27,虽然这对 Python 来说很好,但它导致了 virtualenv 中的错误。

                  【讨论】:

                    【解决方案14】:

                    Windows 解决方案:

                    这是由于PYTHONPATH 变量路径和pipenv 所期望的路径之间的差异。

                    假设系统变量有以下PYTHONPATH‍

                    PYTHONPATH = C:\User\Bruce\AppData\Local\Programs\Python\Python37-32
                    

                    pipenv 正在寻找PYTHONPATH 如下所示:

                    PYTHONPATH = C:\users\bruce\appdata\local\programs\python\python37-32
                    

                    在这里,观察pipenv 正在查找的路径文本与系统环境变量中设置的大小写不同。

                    要解决此问题,请尝试以下步骤,方法是在要运行 pipenv 的文件夹中打开命令提示符:

                    > set PYTHONPATH=C:\users\bruce\appdata\local\programs\python\python37-32
                    

                    您需要提供与 AssertionError 中显示的完全相同的路径。

                    然后运行下面的命令来创建pipenv

                    > pipenv install numpy
                    

                    可以安装任何其他库

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2014-01-26
                      • 2013-06-25
                      • 2012-09-11
                      • 1970-01-01
                      • 2012-06-26
                      • 2014-04-14
                      • 1970-01-01
                      • 2017-07-14
                      相关资源
                      最近更新 更多