如何从python脚本中获取资源文件的完整路径?

Snu*_*fer 3 python path package python-packaging

好的,所以我在包内创建了一个 python 脚本。这棵树看起来像这样:

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 funcs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 stuff.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 resources\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 haarcascade_frontalface_default.xml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 scripts\n\xe2\x94\x82\xc2\xa0\xc2\xa0  \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0  \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 script.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,在脚本文件中,我使用 openCV 的 cv2 来检测人脸,为此需要cv2.CascadeClassifier位于 /resources 下的 XML 文件的路径。现在因为这是一个脚本,我需要能够从任何地方运行它,所以遗憾的是资源文件的相对路径并不能解决问题。如何从 script.py 中获取 xml 文件的绝对路径?您可以假设脚本和 xml 文件分别相对于彼此定位,就像上面的示例一样。谢谢 :))

\n\n

PS:如果该解决方案也适用于鸡蛋,那就更好了。非常感激

\n

sin*_*roc 6

目前最好的方法是importlib.resources。从 Python 3.7 开始,它在标准库中可用。对于早期版本,有一个名为 的向后移植importlib_resources

遵循文档

在你的情况下,这应该或多或少看起来像这样:

import importlib.resources
xml_path = importlib.resources.path('foo.resources', 'haarcascade_frontalface_default.xml')
Run Code Online (Sandbox Code Playgroud)

这样做有很多优点,最重要的是它是标准的,无论安装包在哪里,它都可以工作,即使它是在 zip 文件中。

对于您的情况,您可能必须将__init__.py文件添加到您的resources目录中。