Использование модуля os
работает, но если у вас есть доступ к Python-версии >= 3.4
, тогда pathlib
- это альтернатива, которая работает немного проще и работает лучше на разных платформах:
from pathlib import Path
# when using pathlib.Path, slashes get automatically transformed into the
# correct path-division character, depending on the platform
RESOURCES_PATH = Path(__file__).parent.parent / "resources"
face_cascade = cv2.CascadeClassifier()
face_cascade.load(RESOURCES_PATH / "haarcascade_frontalface_default.xml")
Если вы определите множество таких констант, подумайте над тем, чтобы поместить их все в файл типа foo/util.py
, чтобы их можно было многократно использовать в вашем проекте и не нужно повторно использовать его. объявляется или импортируется из скрипта.
Еще лучшим вариантом в версиях Python >=3.7
является использование importlib.resources.path
, который автоматически разрешает ресурсы из корня пакета, поэтомуне нужно искать его вручную, поднявшись от __file__
:
import importlib
face_cascade = cv2.CascadeClassifier()
with importlib.resources.path("foo.resources", "haarcascade_frontalface_default.xml") as haar_resource:
# haar_resource is a pathlib.Path object here as well, so plugging it is simple
face_cascade.load(haar_resource)
Это намного более элегантно и должно быть предпочтительным решением, если оно доступно.