这是最近开始出现的一个奇怪错误。每当我尝试导入一个不存在的模块时,我都会得到一个 TypeError
而不是 ImportError
:
$ python
Python 3.6.0 (default, Jan 30 2017, 10:05:52)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import missing
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<frozen importlib._bootstrap>", line 961, in _find_and_load
File "<frozen importlib._bootstrap>", line 946, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 885, in _find_spec
File "<frozen importlib._bootstrap_external>", line 1157, in find_spec
File "<frozen importlib._bootstrap_external>", line 1129, in _get_spec
File "<frozen importlib._bootstrap_external>", line 1268, in find_spec
File "<frozen importlib._bootstrap_external>", line 60, in _path_join
File "<frozen importlib._bootstrap_external>", line 60, in <listcomp>
TypeError: a bytes-like object is required, not 'str'
这似乎是一个“你试图从 python3 调用 python2 库,愚蠢”类型的错误,但它显然与我编写的代码无关(正如你从上面的回溯中看到的——我只是开始一个 repl,import missing
,然后发生错误)。这种行为在我安装 python 3.6 后不久就开始发生,但它也发生在我的 python3.5 REPL(我保留它)中,所以它可能与此无关。
对可能发生的事情有任何猜测吗?我在 importlib 中四处寻找了一下,但我在这里几乎不知所措。
编辑:谜底已解,见评论。
请您参考如下方法:
谜团解决了:问题出在 ~/.config/startup.py 函数中,该函数将 git 存储库根目录放到系统路径中(这样无论何时您的 cwd 在 git 存储库中,您都可以启动 REPL 和导入在该存储库中定义的模块)。这是将 git rev-parse --show-toplevel
的结果插入到 sys 路径中,这是 python 3 中的字节对象,这会导致 importlib
报错。