【问题标题】:ValueError: failed to parse CPython sys.version after using conda commandValueError:使用 conda 命令后无法解析 CPython sys.version
【发布时间】:2015-12-08 00:19:27
【问题描述】:

我遇到了一个我无法解决的错误,尽管其他人报告了同样的错误。

我正在远程连接到 Linux 机器。我已经安装了最新版本的 anaconda:

$ bash Anaconda2-2.4.0-Linux-x86_64.sh

// A lot of python libraries get installed

installing: _cache-0.0-py27_x0 ...
Python 2.7.10 :: Continuum Analytics, Inc.
creating default environment...
installation finished. 

我更新了对应的路径,好像可以了:

$ python
Python 2.7.10 |Anaconda 2.4.0 (64-bit)| (default, Oct 19 2015, 18:04:42) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org

太好了,所以现在我想使用 Anaconda 预装的conda。看起来 Anaconda 给了我 3.18.3:

$ conda --version
conda 3.18.3

按照test drive instructions,我更新了conda:

$ conda update conda
Fetching package metadata: An unexpected error has occurred, please consider sending the
following traceback to the conda GitHub issue tracker at:

    https://github.com/conda/conda/issues

Include the output of the command 'conda info' in your report.


Traceback (most recent call last):
  File "/code/anaconda2-4-0/bin/conda", line 5, in <module>
    sys.exit(main())
  File "/code/anaconda2-4-0/lib/python2.7/site-packages/conda/cli/main.py", line 195, in main
    args_func(args, p)
  File "/code/anaconda2-4-0/lib/python2.7/site-packages/conda/cli/main.py", line 202, in args_func
    args.func(args, p)
  File "/code/anaconda2-4-0/lib/python2.7/site-packages/conda/cli/main_update.py", line 48, in execute
    install.install(args, parser, 'update')
  File "/code/anaconda2-4-0/lib/python2.7/site-packages/conda/cli/install.py", line 239, in install
    offline=args.offline)
  File "/code/anaconda2-4-0/lib/python2.7/site-packages/conda/cli/common.py", line 598, in get_index_trap
    return get_index(*args, **kwargs)
  File "/code/anaconda2-4-0/lib/python2.7/site-packages/conda/api.py", line 42, in get_index
    unknown=unknown)
  File "/code/anaconda2-4-0/lib/python2.7/site-packages/conda/utils.py", line 119, in __call__
    value = self.func(*args, **kw)
  File "/code/anaconda2-4-0/lib/python2.7/site-packages/conda/fetch.py", line 237, in fetch_index
    session = CondaSession()
  File "/code/anaconda2-4-0/lib/python2.7/site-packages/conda/connection.py", line 61, in __init__
    super(CondaSession, self).__init__(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 272, in __init__
    self.headers = default_headers()
  File "/usr/lib/python2.7/dist-packages/requests/utils.py", line 555, in default_headers
    'User-Agent': default_user_agent(),
  File "/usr/lib/python2.7/dist-packages/requests/utils.py", line 524, in default_user_agent
    _implementation = platform.python_implementation()
  File "/usr/lib/python2.7/platform.py", line 1521, in python_implementation
    return _sys_version()[0]
  File "/usr/lib/python2.7/platform.py", line 1486, in _sys_version
    repr(sys_version))
ValueError: failed to parse CPython sys.version: '2.7.10 |Anaconda 2.4.0 (64-bit)| (default, Oct 19 2015, 18:04:42) \n[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]'

很遗憾,我不知道如何避免这个错误。

我发现了一些其他 StackOverflow 帖子。 This one 建议从头开始重新安装 python 和 pycharm(但我刚刚安装了 Anaconda,我没有使用 pycharm)。 Another suggests 重新安装机盖,但我没有在这里使用它。最后,a third suggests 这实际上是一个错误,并提出了修复建议。不幸的是,重命名 sys.version 无法解决该错误。这甚至不是我的电脑,所以我不想深入研究代码并冒险搞砸。

我会很感激一些想法或建议。

【问题讨论】:

    标签: python anaconda cpython conda


    【解决方案1】:

    第三种解决方案是正确的。这确实是一个错误,因为修改后的sys.version 字符串破坏了许多依赖于具有特定格式的字符串的platform 模块函数。

    但是,如果您无法正确修复它,您可以尝试一个 hacky 解决方法。模块platform实际上有一个缓存用于解析sys.version字符串:所以你要做的是:

    1. 备份 Anaconda 修改的 sys.version。
    2. 将其替换为合法版本字符串。
    3. 调用任何未解析 sys.version 字符串的 platform 模块函数。
    4. 也为 Anaconda 修改的 sys.version 复制它的缓存。
    5. 从备份中恢复 sys.version。

    破解自己:

    try:
        import sys # Just in case
        start = sys.version.index('|') # Do we have a modified sys.version?
        end = sys.version.index('|', start + 1)
        version_bak = sys.version # Backup modified sys.version
        sys.version = sys.version.replace(sys.version[start:end+1], '') # Make it legible for platform module
        import platform
        platform.python_implementation() # Ignore result, we just need cache populated
        platform._sys_version_cache[version_bak] = platform._sys_version_cache[sys.version] # Duplicate cache
        sys.version = version_bak # Restore modified version string
    except ValueError: # Catch .index() method not finding a pipe
        pass
    

    您需要将此代码放在将在 conda 有机会因异常而失败之前执行的位置。不确定最好的地方是什么,但你可以试试conda/cli/main.pyconda/api.pyconda/connection.py

    【讨论】:

    • 好的,看起来如果我分配 sys.version 并删除竖线内(包括)内的文本,然后 platform.python_implementation() 工作。我该如何长期解决这个问题?我假设sys.version 被分配到实现 sys 的某个地方?我将在 anaconda 目录中搜索它。有什么我应该特别注意的吗?
    • 好的,我认为你的 hack 似乎有效,我把它放在 conda/cli/main.py 中。不幸的是,看起来我现在收到了AttributeError: 'module' object has no attribute 'sslwrap'。看起来问题是我的python版本(2.7.10)高于2.7.8。说真的,如果发生这种情况,人们应该如何在 Linux 上使用 anaconda 和 conda?
    • @ComputerScientist sys.version 由 Python 可执行文件定义。一个长期的解决方案是让 Anaconda 开发人员意识到这个问题并等待他们修复它。如果您想自己开发修复程序,请尝试在 Anaconda 代码中搜索它使用sys.version 字符串的地方。也许他们只是为了视觉而对其进行了修改,您可以毫无问题地删除补丁。最坏的情况是,Anaconda 实际上使用了修改后的 sys.version 的值,然后您必须使用不影响 sys.version 的相同功能的替代解决方案进行修补。
    • 我通过切换到 Python 3.5 解决了这个问题。抱歉,如果这是一个蹩脚的解决方案,但我不想在切换 Python 版本时深入研究代码(并且我使用它的应用程序可以使用 Python 2.7.10 或 3.5)。但关键是,如果我想继续使用 Python 2.7.10,您的 hack确实 有效,这将是第一步。
    • 我在导入熊猫时遇到了这个问题。我通过在 import pandas 行之前将答案的 sn-p 复制到我的 python 脚本中来修复它。
    【解决方案2】:

    刚刚在 Windows 上遇到了同样的问题,通过将 PythonPath 更改为 Anaconda 安装来修复它(我之前安装了 Python)。

    【讨论】:

    • 我最初在 C:\Python27 中安装了 Python 2.7,后来我安装了 Anaconda。我收到与原始海报相同的错误消息。我必须编辑环境变量并删除指向 C:\Python27 的 python 路径,我还添加了安装 Anaconda 的路径。
    • 在 Windows 10 中,我在安装 Anaconda 后安装了 2.7。安装程序会自动设置您的 Python 路径变量。
    【解决方案3】:

    我为这个问题找到了另一个解决方案。在 MAC 上打开 Spyder 时我遇到了同样的问题。这是对我有用的解决方案。

    • 首先从系统中删除现有的 Spyder conda 删除 spyder

    克隆目录并运行设置

    这将打开 spyder 实例。

    【讨论】:

      【解决方案4】:

      系统升级后,我在 Linux 下遇到了同样的问题。通过删除 ~/.local 目录,我设法摆脱了这条消息(“无法解析 CPython sys.version”)。也许有用……

      【讨论】:

      • 我认为我通过切换到 Python 3 解决了这个问题。我不再使用这台计算机,因此无法轻松测试。
      【解决方案5】:

      只需安装正确版本的 python。 对我来说,当我安装 Python 3.6.5 时它起作用了。 使用这个命令

      • conda 安装 Python=3.6.5

      安装完成后再次运行spyder。

      【讨论】:

        【解决方案6】:

        我在使用following line from the FiPy website 安装 FiPy 后尝试打开 Spyder 时遇到此错误 (ValueError: failed to parse CPython sys.version):

        conda create --name <MYFIPYENV> --channel guyer --channel conda-forge fipy nomkl 
        

        错误源于一个名为zmq的包:

        File "/Users/user/anaconda3/lib/python3.6/site-packages/spyder/utils/introspection/plugin_client.py", line 18, in
        import zmq
        File "/Users/user/anaconda3/lib/python3.6/site-packages/zmq/init.py", line 34, in
        from zmq import backend
        File "/Users/user/anaconda3/lib/python3.6/site-packages/zmq/backend/init.py", line 21, in
        if platform.python_implementation() == 'PyPy':
        File "/Users/user/anaconda3/lib/python3.6/platform.py", line 1234, in python_implementation
        return _sys_version()[0]
        File "/Users/user/anaconda3/lib/python3.6/platform.py", line 1192, in _sys_version
        repr(sys_version))
        

        在终端中运行以下代码行解决了它(from a Spyder maintainer on GitHub):

        conda update --name <MYFIPYENV> python pyzmq python.app
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-12
          • 1970-01-01
          • 1970-01-01
          • 2019-01-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多