conda安装qt时报错UnicodeDecodeError

来源:互联网 发布:十大淘宝nike正品店 编辑:程序博客网 时间:2024/05/07 00:59
(vpy35) C:\Users\John>conda install qt -vFetching package metadata .............Solving package specifications: .Package plan for installation in environment C:\Anaconda3\envs\vpy35:The following NEW packages will be INSTALLED:    qt: 5.6.2-vc14_3 [vc14]Proceed ([y]/n)?()===> LINKING PACKAGE: defaults::qt-5.6.2-vc14_3 <===  prefix=C:\Anaconda3\envs\vpy35  source=C:\Anaconda3\pkgs\qt-5.6.2-vc14_3An error occurred while installing package 'defaults::qt-5.6.2-vc14_3'.UnicodeDecodeError('utf-8', b'\xd2\xd1\xb8\xb4\xd6\xc6         1 \xb8\xf6\xce\xc4\xbc\xfe\xa1\xa3\r\n', 0, 1, 'invalid continuation byte')Attempting to roll back.===> REVERSING PACKAGE LINK: defaults::qt-5.6.2-vc14_3 <===  prefix=C:\Anaconda3\envs\vpy35An unexpected error has occurred.Please consider posting the following information to theconda GitHub issue tracker at:    https://github.com/conda/conda/issuesovertaking stderr and stdoutstderr and stdout yielding backCurrent conda install:               platform : win-64          conda version : 4.3.9       conda is private : False      conda-env version : 4.3.9    conda-build version : not installed         python version : 3.6.0.final.0       requests version : 2.12.4       root environment : C:\Anaconda3  (writable)    default environment : C:\Anaconda3\envs\vpy35       envs directories : C:\Anaconda3\envs          package cache : C:\Anaconda3\pkgs           channel URLs : https://conda.anaconda.org/anaconda-fusion/win-64                          https://conda.anaconda.org/anaconda-fusion/noarch                          https://repo.continuum.io/pkgs/free/win-64                          https://repo.continuum.io/pkgs/free/noarch                          https://repo.continuum.io/pkgs/r/win-64                          https://repo.continuum.io/pkgs/r/noarch                          https://repo.continuum.io/pkgs/pro/win-64                          https://repo.continuum.io/pkgs/pro/noarch                          https://repo.continuum.io/pkgs/msys2/win-64                          https://repo.continuum.io/pkgs/msys2/noarch            config file : C:\Users\John\.condarc           offline mode : False             user-agent : conda/4.3.9 requests/2.12.4 CPython/3.6.0 Windows/7 Windows/6.1.7601`$ C:\Anaconda3\Scripts\conda-script.py install qt -v`    Traceback (most recent call last):      File "C:\Anaconda3\lib\site-packages\conda\core\link.py", line 309, in _execute_actions        run_script(target_prefix, Dist(pkg_data), 'post-unlink' if is_unlink else 'post-link')      File "C:\Anaconda3\lib\site-packages\conda\core\link.py", line 480, in run_script        subprocess_call(command_args, env=env)      File "C:\Anaconda3\lib\site-packages\conda\gateways\subprocess.py", line 61, in subprocess_call        return Response(ensure_text_type(stdout), ensure_text_type(stderr), int(rc))      File "C:\Anaconda3\lib\site-packages\conda\common\compat.py", line 155, in ensure_text_type        return value.decode('utf-8') if hasattr(value, 'decode') else value    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd2 in position 0: invalid continuation byte    During handling of the above exception, another exception occurred:    Traceback (most recent call last):      File "C:\Anaconda3\lib\site-packages\conda\core\link.py", line 262, in execute        pkg_data, actions)      File "C:\Anaconda3\lib\site-packages\conda\core\link.py", line 326, in _execute_actions        reverse_excs,    conda.CondaMultiError: 'utf-8' codec can't decode byte 0xd2 in position 0: invalid continuation byte    During handling of the above exception, another exception occurred:    Traceback (most recent call last):      File "C:\Anaconda3\lib\site-packages\conda\exceptions.py", line 616, in conda_exception_handler        return_value = func(*args, **kwargs)      File "C:\Anaconda3\lib\site-packages\conda\cli\main.py", line 137, in _main        exit_code = args.func(args, p)      File "C:\Anaconda3\lib\site-packages\conda\cli\main_install.py", line 80, in execute        install(args, parser, 'install')      File "C:\Anaconda3\lib\site-packages\conda\cli\install.py", line 359, in install        execute_actions(actions, index, verbose=not context.quiet)      File "C:\Anaconda3\lib\site-packages\conda\plan.py", line 837, in execute_actions        execute_instructions(plan, index, verbose)      File "C:\Anaconda3\lib\site-packages\conda\instructions.py", line 258, in execute_instructions        cmd(state, arg)      File "C:\Anaconda3\lib\site-packages\conda\instructions.py", line 119, in UNLINKLINKTRANSACTION_CMD        txn.execute()      File "C:\Anaconda3\lib\site-packages\conda\core\link.py", line 278, in execute        rollback_excs,    conda.CondaMultiError: 'utf-8' codec can't decode byte 0xd2 in position 0: invalid continuation byte


报错的代码为File "C:\Anaconda3\lib\site-packages\conda\core\link.py", line 278, in execute

    def execute(self):        if not self._verified:            self.verify()        pkg_idx = 0        try:            for pkg_idx, (pkg_data, actions) in enumerate(self.all_actions):                self._execute_actions(self.target_prefix, self.num_unlink_pkgs, pkg_idx,                                      pkg_data, actions)        except Exception as execute_multi_exc:            # reverse all executed packages except the one that failed            rollback_excs = []            if context.rollback_enabled:                failed_pkg_idx = pkg_idx                reverse_actions = self.all_actions[:failed_pkg_idx]                for pkg_idx, (pkg_data, actions) in reversed(tuple(enumerate(reverse_actions))):                    excs = self._reverse_actions(self.target_prefix, self.num_unlink_pkgs,                                                 pkg_idx, pkg_data, actions)                    rollback_excs.extend(excs)            raise CondaMultiError(tuple(concatv(                (execute_multi_exc.errors                 if isinstance(execute_multi_exc, CondaMultiError)                 else (execute_multi_exc,)),                rollback_excs,            )))        else:            for pkg_idx, (pkg_data, actions) in enumerate(self.all_actions):                for axn_idx, action in enumerate(actions):                    action.cleanup()

跟踪函数_execute_actions

    @staticmethod    def _execute_actions(target_prefix, num_unlink_pkgs, pkg_idx, pkg_data, actions):        axn_idx, action, is_unlink = 0, None, True        try:            dist = Dist(pkg_data)            is_unlink = pkg_idx <= num_unlink_pkgs - 1            if is_unlink:                log.info("===> UNLINKING PACKAGE: %s <===\n"                         "  prefix=%s\n",                         dist, target_prefix)            else:                log.info("===> LINKING PACKAGE: %s <===\n"                         "  prefix=%s\n"                         "  source=%s\n",                         dist, target_prefix, pkg_data.extracted_package_dir)            run_script(target_prefix if is_unlink else pkg_data.extracted_package_dir,                       Dist(pkg_data),                       'pre-unlink' if is_unlink else 'pre-link',                       target_prefix)            for axn_idx, action in enumerate(actions):                action.execute()            run_script(target_prefix, Dist(pkg_data), 'post-unlink' if is_unlink else 'post-link')        except Exception as e:  # this won't be a multi error            # reverse this package            log.debug("Error in action #%d for pkg_idx #%d %r", axn_idx, pkg_idx, action)            log.debug(format_exc())            reverse_excs = ()            if context.rollback_enabled:                log.error("An error occurred while %s package '%s'.\n"                          "%r\n"                          "Attempting to roll back.\n",                          'uninstalling' if is_unlink else 'installing', Dist(pkg_data), e)                reverse_excs = UnlinkLinkTransaction._reverse_actions(                    target_prefix, num_unlink_pkgs, pkg_idx, pkg_data, actions,                    reverse_from_idx=axn_idx                )            raise CondaMultiError(tuple(concatv(                (e,),                reverse_excs,            )))

跟踪函数run_script

错误是由执行了.qt-post-link.bat后产生

def run_script(prefix, dist, action='post-link', env_prefix=None):    """    call the post-link (or pre-unlink) script, and return True on success,    False on failure    """    path = join(prefix,                'Scripts' if on_win else 'bin',                '.%s-%s.%s' % (dist.name, action, 'bat' if on_win else 'sh'))    if not isfile(path):        return True    env = os.environ.copy()    if action == 'pre-link':        is_old_noarch = False        try:            with open(path) as f:                script_text = ensure_text_type(f.read())            if "This is code that is added to noarch Python packages." in script_text:                is_old_noarch = True        except Exception as e:            import traceback            log.debug(e)            log.debug(traceback.format_exc())        env['SOURCE_DIR'] = prefix        if not is_old_noarch:            warnings.warn(dals("""            Package %s uses a pre-link script. Pre-link scripts are potentially dangerous.            This is because pre-link scripts have the ability to change the package contents in the            package cache, and therefore modify the underlying files for already-created conda            environments.  Future versions of conda may deprecate and ignore pre-link scripts.            """ % dist))    if on_win:        try:            command_args = [os.environ[str('COMSPEC')], '/c', path]        except KeyError:            log.info("failed to run %s for %s due to COMSPEC KeyError", action, dist)            return False    else:        shell_path = '/bin/sh' if 'bsd' in sys.platform else '/bin/bash'        command_args = [shell_path, "-x", path]    env['ROOT_PREFIX'] = context.root_prefix    env['PREFIX'] = env_prefix or prefix    env['PKG_NAME'] = dist.name    env['PKG_VERSION'] = dist.version    env['PKG_BUILDNUM'] = dist.build_number    try:        log.debug("for %s at %s, executing script: $ %s",                  dist, env['PREFIX'], ' '.join(command_args))        subprocess_call(command_args, env=env)    except CalledProcessError as e:        m = messages(prefix)        if action in ('pre-link', 'post-link'):            if 'openssl' in text_type(dist):                # this is a hack for conda-build string parsing in the conda_build/build.py                #   create_env function                message = "%s failed for: %s" % (action, dist)            else:                message = dals("""                %s script failed for package %s                running your command again with `-v` will provide additional information                location of failed script: %s                ==> script messages <==                %s                """) % (action, dist, path, m or "<None>")            raise LinkError(message)        else:            log.warn("%s script failed for package %s\n"                     "consider notifying the package maintainer", action, dist)            return False    else:        messages(prefix)        return True

跟踪函数subprocess_call

在文件C:\Anaconda3\Lib\site-packages\conda\gateways\subprocess.py中

def subprocess_call(command, env=None, path=None, stdin=None, raise_on_error=True):    """This utility function should be preferred for all conda subprocessing.    It handles multiple tricky details.    """    env = {str(k): str(v) for k, v in iteritems(env if env else os.environ)}    path = sys.prefix if path is None else abspath(path)    log.debug("executing>> %s", ' '.join(command))    p = Popen(_split_on_unix(command) if isinstance(command, string_types) else command,              cwd=path, stdin=PIPE, stdout=PIPE, stderr=PIPE, env=env)    ACTIVE_SUBPROCESSES.add(p)    stdin = ensure_binary(stdin) if isinstance(stdin, string_types) else None    stdout, stderr = p.communicate(input=stdin)    rc = p.returncode    ACTIVE_SUBPROCESSES.remove(p)    if raise_on_error and rc != 0:        log.info(_format_output(command, path, rc, stdout, stderr))        raise CalledProcessError(rc, command,                                 output=_format_output(command, path, rc, stdout, stderr))    if log.isEnabledFor(TRACE):        log.trace(_format_output(command, path, rc, stdout, stderr))    return Response(ensure_text_type(stdout), ensure_text_type(stderr), int(rc))

错误由ensure_text_type(stdout)导致

C:\Anaconda3\Lib\site-packages\conda\common\compat.py

def ensure_text_type(value):    return value.decode('utf-8') if hasattr(value, 'decode') else value

stdout输出为

b'\xd2\xd1\xb8\xb4\xd6\xc6         1 \xb8\xf6\xce\xc4\xbc\xfe\xa1\xa3\r\n'

在将其使用utf-8解码时产生异常UnicodeDecodeError

在函数subprocess_call最后使用来避免此错误

    try:        return Response(ensure_text_type(stdout), ensure_text_type(stderr), int(rc))    except Exception as e:        return Response((stdout), (stderr), int(rc))




1 1
原创粉丝点击