解决方案:
注意文件名的编码
解决过程:
在用 Conan 编译 C++过程中遇到报错"‘ascii’ codec can’t decode byte 0xe5 in position 36: ordinal not in range(128)
",困扰多时,问题如下:
***/1.5935.9@***/stable: Retrieving package 6d3344e2e47d9a7babae472f14e7df46f9d74492 from remote '***'
Downloading conanmanifest.txt
[==================================================] 5.8KB/5.8KB
Downloading conaninfo.txt
[==================================================] 462B/462B
Downloading conan_package.tgz
[==================================================] 1.29GB/1.29GB
Decompressing conan_package.tgz: 28%|██▊ | 347M/1.20G [00:04<00:09, 101MB/s] ***/1.5935.9@***/stable: ERROR: Exception while getting package: 6d3344e2e47d9a7babae472f14e7df46f9d74492
***/1.5935.9@***/stable: ERROR: Exception: <class 'conans.errors.ConanException'> Error while downloading/extracting files to /root/.conan/data/***/1.5935.9/***/stable/package/6d3344e2e47d9a7babae472f14e7df46f9d74492
'ascii' codec can't decode byte 0xe5 in position 36: ordinal not in range(128)
Folder removed
***/1.5935.9@***/stable: WARN: Trying to remove package folder: /root/.conan/data/***/1.5935.9/***/stable/package/6d3344e2e47d9a7babae472f14e7df46f9d74492
ERROR: Error while downloading/extracting files to /root/.conan/data/***/1.5935.9/***/stable/package/6d3344e2e47d9a7babae472f14e7df46f9d74492
'ascii' codec can't decode byte 0xe5 in position 36: ordinal not in range(128)
虽然知道是 Python 中常见编码问题,但是不可能改 Conan 源码,而且还不知道问题在哪儿,只能一脸懵逼。
后来,偶然在其他系统中拿到了堆栈详情:
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/conans/client/command.py", line 1428, in run
method(args[0][1:])
File "/usr/lib/python2.7/site-packages/conans/client/command.py", line 384, in install
install_folder=args.install_folder)
File "/usr/lib/python2.7/site-packages/conans/client/conan_api.py", line 88, in wrapper
return f(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/conans/client/conan_api.py", line 533, in install
no_imports=no_imports)
File "/usr/lib/python2.7/site-packages/conans/client/manager.py", line 130, in install
run_imports(conanfile, install_folder, output)
File "/usr/lib/python2.7/site-packages/conans/client/importer.py", line 82, in run_imports
conanfile.imports()
File "/usr/lib/python2.7/site-packages/conans/client/loader_txt.py", line 97, in imports
conan_file.copy(*import_params)
File "/usr/lib/python2.7/site-packages/conans/client/importer.py", line 160, in __call__
excludes=excludes, keep_path=keep_path)
File "/usr/lib/python2.7/site-packages/conans/client/file_copier.py", line 82, in __call__
copied_files = self._copy_files(files_to_copy, src, dst, keep_path, links)
File "/usr/lib/python2.7/site-packages/conans/client/file_copier.py", line 193, in _copy_files
abs_src_name = os.path.join(src, filename)
File "/usr/lib64/python2.7/posixpath.py", line 80, in join
path += '/' + b
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 29: ordinal not in range(128)
ERROR: 'ascii' codec can't decode byte 0xe5 in position 29: ordinal not in range(128)
查阅 Github 上的对应源码:
abs_src_name = os.path.join(src, filename)
由此判断是文件名引起,检查发现一个包含中文的文件,处理后问题解决。