做出详细的代码无法按原样工作的答案通常是没有意义的,但是我认为这是一个例外。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')
这种行为的原因是“这是设计使然”;但是设计可能会改变 ...