给定一些已安装的软件包,以下代码可用于打印其在文件系统上的位置:
import importlib.resources
def print_package_path():
with importlib.resources.path("importlib", "") as path:
print(path)
if __name__ == "__main__":
print_package_path() # /home/me/python_3.8/lib/python3.8/importlib on my machine
如果我想测试一个包含这样一个语句的函数pytest
作为测试套件并pyfakefs
在测试期间伪造文件系统,它会崩溃并出现一个令人困惑的错误(IsADirectoryError: [Errno 21] Is a directory
在 ubuntu 和PermissionError: [Errno 13] Permission denied
Windows 上)——甚至不需要对fs
夹具,它只需要在代码运行时就在那里。
让pytest
执行这个函数
def test_package_path(fs):
print_package_path()
将导致
______________________________ test_package_path _______________________________
fs = <pyfakefs.fake_filesystem.FakeFilesystem object at 0x7f84f2996910>
def test_package_path(fs):
> print_package_path()
/home/me/foo.py:11:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/home/me/foo.py:4: in print_package_path
with importlib.resources.path("importlib", "") as path:
/home/me/pythons/python_3.8/lib/python3.8/contextlib.py:113: in __enter__
return next(self.gen)
/home/me/venv/lib/python3.8/importlib/resources.py:201: in path
with open_binary(package, resource) as fp:
/home/me/venv/lib/python3.8/importlib/resources.py:91: in open_binary
return reader.open_resource(resource)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <_frozen_importlib_external.SourceFileLoader object at 0x7f84f7527370>
resource = ''
> ???
E IsADirectoryError: [Errno 21] Is a directory: '/home/me/venv/lib/python3.8/importlib'
<frozen importlib._bootstrap_external>:988: IsADirectoryError
这对我来说零意义。一个目录应该从一开始就不能用作资源吗?
我必须承认我并不真正了解该importlib.resources
模块,所以我可能只是使用错误(我的实际用例是在开发过程中创建一个文件,并避免使用__file__
找到正确的位置)。