From 9445f966b92308abeeefe9936398a9e4d4a7d060 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Thu, 5 Mar 2026 16:37:20 -0800 Subject: [PATCH 1/2] Unify site-packages handling and copy for Pyodide Compute a single sitePackagesRoot (defaulting to build/site-packages but overridden by the environment variable) before installing requirements. Use that path when installing requirements, and for the Pyodide platform copy the site-packages into the temp app archive directory (defaultSitePackagesDir). Also cleans up nullable logic and minor variable handling. --- src/serious_python/bin/package_command.dart | 42 +++++++++++++-------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/src/serious_python/bin/package_command.dart b/src/serious_python/bin/package_command.dart index 3f410047..0a660e44 100644 --- a/src/serious_python/bin/package_command.dart +++ b/src/serious_python/bin/package_command.dart @@ -260,23 +260,20 @@ class PackageCommand extends Command { await cleanupDir(tempDir, allJunkFiles); } - // install requirements - if (requirements.isNotEmpty && !skipSitePackages) { - String? sitePackagesRoot; - - if (platform != "Pyodide") { - if (Platform.environment - .containsKey(sitePackagesEnvironmentVariable)) { - sitePackagesRoot = - Platform.environment[sitePackagesEnvironmentVariable]; - } - if (sitePackagesRoot == null || sitePackagesRoot.isEmpty) { - sitePackagesRoot = path.join(currentPath, "build", "site-packages"); - } - } else { - sitePackagesRoot = path.join(tempDir.path, defaultSitePackagesDir); + // site-packages root + String sitePackagesRoot = + path.join(currentPath, "build", "site-packages"); + if (Platform.environment + .containsKey(sitePackagesEnvironmentVariable)) { + final envValue = + Platform.environment[sitePackagesEnvironmentVariable]; + if (envValue != null && envValue.isNotEmpty) { + sitePackagesRoot = envValue; } + } + // install requirements + if (requirements.isNotEmpty && !skipSitePackages) { if (await Directory(sitePackagesRoot).exists()) { await for (var f in Directory(sitePackagesRoot) .list() @@ -432,6 +429,21 @@ class PackageCommand extends Command { } } + // copy site packages to temp dir for web platform + if (platform == "Pyodide") { + final sitePackagesSrcDir = Directory(sitePackagesRoot); + if (await sitePackagesSrcDir.exists()) { + stdout.writeln("Copying site packages to app archive"); + final webPkgDir = + Directory(path.join(tempDir.path, defaultSitePackagesDir)); + if (!await webPkgDir.exists()) { + await webPkgDir.create(recursive: true); + } + await copyDirectory( + sitePackagesSrcDir, webPkgDir, sitePackagesSrcDir.path, []); + } + } + // create archive stdout.writeln( "Creating app archive at ${dest.path} from a temp directory"); From eb0bf8d19543f8cacc94b9740f58a4e82d30f136 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Thu, 5 Mar 2026 16:39:48 -0800 Subject: [PATCH 2/2] Copy site-packages for Pyodide only when needed Add a guard to only copy site-packages for the Pyodide platform if there are requirements to include (requirements.isNotEmpty). This prevents unnecessary copying of the site-packages directory when no requirements are specified, avoiding wasted I/O and archive bloat. --- src/serious_python/bin/package_command.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/serious_python/bin/package_command.dart b/src/serious_python/bin/package_command.dart index 0a660e44..1e5ca90a 100644 --- a/src/serious_python/bin/package_command.dart +++ b/src/serious_python/bin/package_command.dart @@ -430,7 +430,7 @@ class PackageCommand extends Command { } // copy site packages to temp dir for web platform - if (platform == "Pyodide") { + if (platform == "Pyodide" && requirements.isNotEmpty) { final sitePackagesSrcDir = Directory(sitePackagesRoot); if (await sitePackagesSrcDir.exists()) { stdout.writeln("Copying site packages to app archive");