当运行一个简单的python代码时,它会抱怨main和spec为NONE

当运行一个简单的python代码时,它会抱怨main和spec为NONE,python,python-3.x,Python,Python 3.x,我是python新手,我发现了一个我需要使用的非常智能的库,它只用python编写 这是我代码的一部分 from pkgutil import get_data grammar = get_data(__name__, "thl.lark").decode("utf-8") 现在当我运行它时,我得到了 Traceback (most recent call last): File "/Users/xxx/thl/thl-jupyter-2

我是python新手,我发现了一个我需要使用的非常智能的库,它只用python编写

这是我代码的一部分

from pkgutil import get_data

grammar = get_data(__name__, "thl.lark").decode("utf-8")
现在当我运行它时,我得到了

Traceback (most recent call last):
  File "/Users/xxx/thl/thl-jupyter-2020/thl/test.py", line 6, in <module>
    grammar = get_data(__name__, "thl.lark").decode("utf-8")
  File "/xxx/.pyenv/versions/3.9.0/lib/python3.9/pkgutil.py", line 620, in get_data
    spec = importlib.util.find_spec(package)
  File "/xxx/.pyenv/versions/3.9.0/lib/python3.9/importlib/util.py", line 114, in find_spec
    raise ValueError('{}.__spec__ is None'.format(name))
ValueError: __main__.__spec__ is None
回溯(最近一次呼叫最后一次):
文件“/Users/xxx/thl/thl-jupyter-2020/thl/test.py”,第6行,在
语法=获取数据(名称),解码(“utf-8”)
get_数据中的文件“/xxx/.pyenv/versions/3.9.0/lib/python3.9/pkgutil.py”,第620行
spec=importlib.util.find_spec(包)
文件“/xxx/.pyenv/versions/3.9.0/lib/python3.9/importlib/util.py”,第114行,在find_spec中
raise VALUERROR(“{}.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
ValueError:\uuuuu main\uuuuuuuuuuu.\uuuuuuuuuuu spec\uuuuuuuuuuuuuuuuuuuuuuuuuu为无

知道发生了什么吗?

从解决第6行开始,剥掉不确定的部分,然后逐块添加它们。

pkgutil.get_data
是一个从包中检索资源文件的功能


您的
test.py
不是一个包。尝试使用
pkgutil.get_data
是没有意义的,因为您的文件是一个普通模块,而不是一个包,并且它不能包含任何资源文件。

如果您使用
-m
标志运行脚本,只要它可以工作。
这意味着您的脚本将作为模块而不是独立脚本执行。我可以假设
pkgutil
需要一个模块才能工作

python -m your_script.py

关于python模块和独立脚本之间的区别有很多不同之处。

第6行是grammar=get_data(名称,“thl.lark”)。解码(“utf-8”),我不知道发生了什么there@Learner:那你为什么要写那行?为什么你希望它能起作用?我正在尝试使用get_数据在thl.lark上加载一些行。我搜索了web,通常名称作为第一个参数传递,所以我没有找到sameI无法找到get data为什么不加载thl.larkWhat(和where)is
thl.lark
?正如我所说,这是测试库代码的一部分,我是Python新手,这可能不会引发异常,但是它将无效的参数传递给pkgutil.get_data,由于缺少参数验证,它只能侥幸工作
pkgutil.get_data
要求包名作为第一个参数。它应该检索包裹内容。