@@ -108,6 +108,74 @@ An alternative build directory can be specified using the
108108:option: `build-dir ` config setting.
109109
110110
111+ Data files
112+ ----------
113+
114+ It is relatively common to install data files needed at runtime
115+ alongside the package's Python code or extension modules. For a Python
116+ package named ``package `` this would look like this:
117+
118+ .. TODO update the text block below to 'meson' when
119+ .. meson lexer is updated to fix
120+ .. https://github.com/pygments/pygments/issues/2918
121+
122+ .. code-block :: text
123+
124+ py = import('python').find_installation()
125+
126+ py.install_sources(
127+ '__init__.py',
128+ subdir: 'package',
129+ )
130+
131+ install_data(
132+ 'data.txt',
133+ install_dir: py.get_install_dir() / 'package',
134+ )
135+
136+ custom_target(
137+ output: 'uuid.txt',
138+ command: [py, '-m', 'uuid''],
139+ capture: true,
140+ install: true,
141+ install_dir: py.get_install_dir() / 'package',
142+ )
143+
144+ In most circumstances, these files can be accessed deriving their
145+ filesystem path from the filesystem path of the Python module next to
146+ them via the ``__file__ `` special variable. For example, within the
147+ package ``__init__.py ``:
148+
149+ .. code-block :: python
150+
151+ import pathlib
152+
153+ data = pathlib.Path(__file__ ).parent.joinpath(' data.txt' ).read_text()
154+ uuid = pathlib.Path(__file__ ).parent.joinpath(' uuid.txt' ).read_text() # WRONG!
155+
156+ However, this does not work when modules are not loaded from a package
157+ installed in the Python library path in the filesystem but with a
158+ special module loader, as used to implement editable installs in
159+ ``meson-python ``. In the example above, the second read would fail
160+ when the package is installed in editable mode. For this reason, data
161+ files need to be accessed using :mod: `importlib.resources `. The code
162+ above should be replaced with:
163+
164+ .. code-block :: python
165+
166+ import importlib.resources
167+
168+ data = importlib.resources.files().joinpath(' data.txt' ).read_text()
169+ uuid = importlib.resources.files().joinpath(' uuid.txt' ).read_text()
170+
171+ :mod: `importlib.resources ` implements a virtual filesystem that allows
172+ to access individual files as if they were in their install location.
173+ However, there is not way to expose this file structure outside of the
174+ python runtime. In the example above, it is not possible to make the
175+ ``data.txt `` and ``uuid.txt `` files appear in the same fileystem
176+ directory.
177+
178+
111179.. _how-to-guides-editable-installs-verbose :
112180
113181Verbose mode
0 commit comments