package/pkg-python: clean conflicting pep517 packages before install
The python installer package isn't able to overwrite files of packges that already exist, this causes problems when doing a rebuild or update without a full clean. To fix this we can use functionality from importlib to identify and remove any conflicting python package files before installation. We also need to use internals from python-installer, as we want to use the same logic as pyinstaller uses internally for getting the scheme so that we ensure we clean the correct package scheme (we want it to be the same as the one we're installing) Fixes: Traceback (most recent call last): File "/home/buildroot/buildroot/support/scripts/pyinstaller.py", line 69, in <module> main() File "/home/buildroot/buildroot/support/scripts/pyinstaller.py", line 61, in main install( File "/home/buildroot/buildroot/output/host/lib/python3.10/site-packages/installer/_core.py", line 109, in install record = destination.write_file( File "/home/buildroot/buildroot/output/host/lib/python3.10/site-packages/installer/destinations.py", line 207, in write_file return self.write_to_fs(scheme, path_, stream, is_executable) File "/home/buildroot/buildroot/output/host/lib/python3.10/site-packages/installer/destinations.py", line 167, in write_to_fs raise FileExistsError(message) FileExistsError: File already exists: /home/buildroot/buildroot/output/target/usr/lib/python3.10/site-packages/tinycss2/__init__.py Signed-off-by: James Hilliard <james.hilliard1@gmail.com> Tested-by: Marcus Hoffmann <marcus.hoffmann@othermo.de> [yann.morin.1998@free.fr: - extend commit log about the use of the installer internals (the symbols prefixed with '_') - check path.files against explicitly None ] Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
This commit is contained in:
parent
d752f73b0c
commit
fc429c4dc6
@ -2,12 +2,34 @@
|
|||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import glob
|
import glob
|
||||||
|
import pathlib
|
||||||
|
|
||||||
|
from importlib.machinery import PathFinder
|
||||||
|
from importlib.metadata import DistributionFinder
|
||||||
|
|
||||||
from installer import install
|
from installer import install
|
||||||
|
from installer._core import _process_WHEEL_file
|
||||||
from installer.destinations import SchemeDictionaryDestination
|
from installer.destinations import SchemeDictionaryDestination
|
||||||
from installer.sources import WheelFile
|
from installer.sources import WheelFile
|
||||||
|
|
||||||
|
|
||||||
|
def clean(source, destination):
|
||||||
|
scheme = _process_WHEEL_file(source)
|
||||||
|
scheme_path = destination.scheme_dict[scheme]
|
||||||
|
context = DistributionFinder.Context(
|
||||||
|
name=source.distribution,
|
||||||
|
path=[scheme_path],
|
||||||
|
)
|
||||||
|
for path in PathFinder.find_distributions(context=context):
|
||||||
|
# path.files is either an iterable, or None
|
||||||
|
if path.files is None:
|
||||||
|
continue
|
||||||
|
for file in path.files:
|
||||||
|
file_path = pathlib.Path(file.locate())
|
||||||
|
if file_path.exists():
|
||||||
|
file_path.unlink()
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
"""Entry point for CLI."""
|
"""Entry point for CLI."""
|
||||||
ap = argparse.ArgumentParser("python pyinstaller.py")
|
ap = argparse.ArgumentParser("python pyinstaller.py")
|
||||||
@ -58,6 +80,7 @@ def main():
|
|||||||
)
|
)
|
||||||
|
|
||||||
with WheelFile.open(glob.glob(args.wheel_file)[0]) as source:
|
with WheelFile.open(glob.glob(args.wheel_file)[0]) as source:
|
||||||
|
clean(source, destination)
|
||||||
install(
|
install(
|
||||||
source=source,
|
source=source,
|
||||||
destination=destination,
|
destination=destination,
|
||||||
|
Loading…
Reference in New Issue
Block a user