回答详细说明无法按原样工作的代码通常没有意义,但我认为这是一个例外。Python 3.7 添加importlib.resources
了应该替换pkg_resources
. 它适用于访问名称中没有斜杠的包中的文件,即
foo/
__init__.py
module1.py
module2.py
data/
data.txt
data2.txt
即您可以使用例如访问data2.txt
内部包foo
importlib.resources.open_binary('foo', 'data2.txt')
但它会失败,但有一个例外
>>> importlib.resources.open_binary('foo', 'data/data.txt')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.7/importlib/resources.py", line 87, in open_binary
resource = _normalize_path(resource)
File "/usr/lib/python3.7/importlib/resources.py", line 61, in _normalize_path
raise ValueError('{!r} must be only a file name'.format(path))
ValueError: 'data/data2.txt' must be only a file name
除非将其放入__init__.py
然后data
将其用作包装,否则无法解决此问题:
importlib.resources.open_binary('foo.data', 'data.txt')
这种行为的原因是“这是设计使然”;但设计可能会改变......