importterror是由工作目录中同名文件和导入包中的同名文件引起的



我在尝试运行python脚本时遇到了一个问题,为了简单起见,我们将其称为my_tokenizer.py,其内容只是导入拥抱脸的变形器。不幸的是,尝试从工作目录运行它会导致importterror,这似乎是由于工作目录中的文件名称造成的,并且与transformer包在其内部使用的文件名称相同。

在工作目录中有2个文件:

  • /project/my_tokenizer.py(只包含import "import transformer "一行)
  • /project/tokenizers.py(空文件)

运行python my_tokenizer.py会导致如下importterror:

Traceback (most recent call last):
File "project/my_tokenizer.py", line 1, in <module>
import transformers
File "/Users/radoslawslowinski/opt/anaconda3/envs/aa_ee/lib/python3.8/site-packages/transformers/__init__.py", line 54, in <module>
from .data import (
File "/Users/radoslawslowinski/opt/anaconda3/envs/aa_ee/lib/python3.8/site-packages/transformers/data/__init__.py", line 6, in <module>
from .processors import (
File "/Users/radoslawslowinski/opt/anaconda3/envs/aa_ee/lib/python3.8/site-packages/transformers/data/processors/__init__.py", line 5, in <module>
from .glue import glue_convert_examples_to_features, glue_output_modes, glue_processors, glue_tasks_num_labels
File "/Users/radoslawslowinski/opt/anaconda3/envs/aa_ee/lib/python3.8/site-packages/transformers/data/processors/glue.py", line 24, in <module>
from ...tokenization_utils import PreTrainedTokenizer
File "/Users/radoslawslowinski/opt/anaconda3/envs/aa_ee/lib/python3.8/site-packages/transformers/tokenization_utils.py", line 26, in <module>
from .tokenization_utils_base import (
File "/Users/radoslawslowinski/opt/anaconda3/envs/aa_ee/lib/python3.8/site-packages/transformers/tokenization_utils_base.py", line 31, in <module>
from tokenizers import AddedToken
ImportError: cannot import name 'AddedToken' from 'tokenizers' (/Users/radoslawslowinski/project/tokenizers.py)

虽然我可以把我的文件从project/tokenizers.py重命名为其他东西,但我想知道为什么会发生。

我想我已经理解了导致这个问题的原因-它是在包transformer(内部导入另一个名为tokenizers的包)中使用我的本地文件tokenizers.py的同名遮蔽文件。

之所以如此,是因为我的工作目录是要搜索的路径列表中的第一个,以便找到导入。可以通过以下命令检查:

import sys
print(sys.path)
from transformers import BasicTokenizer

为了证明对导入的搜索是从调用script的目录开始的,可以先移动sys。路径到列表的末尾,下面的代码将工作:

import sys
sys.path = sys.path[1:] + sys.path[:1]
import transformers

我认为你有类AddedToken或函数AddedToken。如果你正在导入它,那么解释器不会得到要导入的内容,因为有2个文件作为名称转换器,所以它会导入自己,如果本身没有AddedToken,它会导致错误或转换器没有AddedToken。
谢谢
祝您愉快
-杠杆

最新更新