[请教:为什么直接运行
会提示No module named ‘tests.test_utility’?](https://bbs.hankcs.com/t/topic/79)
看到有人在bbs上问这个问题,而回答问题的很多答主都没有真正解决提问者的问题,主要提到的是添加python包路径,需要注意的是,路径需要设置到tests所在的上一目录,即如下图所示,设置到code目录即可,不然的话,会出现找不到包tests
其实除此之外,很多人添加了还是发现无法使用tests包,为什么呢?因为还可能存在另一个问题。
可以查看tests目录下的__init__.py文件,而普通目录和python包最大的不同就在于此,这个文件的作用是:当用 import 导入该目录时,会执行 init.py 里面的代码,而很明显可以看到,这里源代码中是没有写__init__.py的,因此,我们只需要把其完善即可,这样就可以直接调用
# -*- coding:utf-8 -*-
# Author:hankcs
# Date: 2018-06-03 19:15
# Author: BugII
# Date: 2021-11-10 20:32
# 直接用何老师的包会报错,原因是因为没有写好tests包的__init__.py,导致即便添加了路径也找不到对应的文件
from .test_custom_dict import *
from .test_hanlp import *
from .test_multithread import *
from .test_utility import *
from .test_word2vec import *
后面经实验发现,其实不加上也可以,因为就在tests的目录下,索引的时候还是可以直接找到(以上方法仅供屡次不成功的参考)
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x9c in position 2: illegal multibyte sequence
TypeError: a bytes-like object is required, not ‘str’
此外,这个zipf_law.py还不能直接跑通,主要出现以上两个问题,处理如下代码所示
f = Counter()
with open(msr, 'rb') as src: # 加'rb', UnicodeDecodeError: 'gbk' codec can't decode byte 0x9c in position 2: illegal multibyte sequence
for line in src:
# TypeError: a bytes-like object is required, not 'str'
# 需要解码
line = line.decode()
line = line.strip()
for word in line.split(' '):
# word = word.strip()
# if len(word) < 2: continue
f[word] += 1
或者由于提示不能用gbk,那么指定编码方式就行
f = Counter()
with open(msr, encoding="utf-8") as src: # 加'encoding', UnicodeDecodeError: 'gbk' codec can't decode byte 0x9c in position 2: illegal multibyte sequence
for line in src:
line = line.strip()
for word in line.split(' '):
# word = word.strip()
# if len(word) < 2: continue
f[word] += 1
上述问题简单解决方法
昨天其实采用了比较暴力的方法,对每个open都指定了encoding编码方式,但发现何老师其他还有很多地方都直接用open,所以直接改太费时间了,上网查资料发现,可以传递参数给python解释器采用某种编码方式执行。类似于如下
python -X utf8 xxx.py
VS code 使用pythonArgs指定要传递给Python解释器的参数
笔者平时用的比较多的是VS code,这里也给出VS code设置方法,需改VS code python的运行调试脚本,即launch.json,查阅官方文档得知,要传指定要传递给Python解释器的参数可以通过pythonArgs,如下所示。
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: 当前文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
// pythonArgs 指定要传递给Python解释器的参数
"pythonArgs": [
"-X","utf8"
]
}
]
}
最后,这本书配置的源代码是没问题的,但有些系统上不一致的地方可能会出现小问题,以上都是我在window10上操作的结果,仅供参考。