Nuitka-winsvc 2.6__cp311-cp311-win_amd64.whl → 2.6.5__cp311-cp311-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of Nuitka-winsvc might be problematic. Click here for more details.

Files changed (65) hide show
  1. {Nuitka_winsvc-2.6.dist-info → Nuitka_winsvc-2.6.5.dist-info}/METADATA +1 -1
  2. {Nuitka_winsvc-2.6.dist-info → Nuitka_winsvc-2.6.5.dist-info}/RECORD +65 -61
  3. nuitka/BytecodeCaching.py +14 -3
  4. nuitka/ModuleRegistry.py +18 -3
  5. nuitka/Options.py +92 -66
  6. nuitka/PythonFlavors.py +15 -0
  7. nuitka/Version.py +1 -1
  8. nuitka/build/SconsCompilerSettings.py +3 -4
  9. nuitka/build/SconsInterface.py +2 -2
  10. nuitka/build/include/nuitka/compiled_frame.h +1 -1
  11. nuitka/build/include/nuitka/exceptions.h +1 -1
  12. nuitka/build/include/nuitka/type_aliases.h +1 -1
  13. nuitka/build/inline_copy/pefile/ordlookup/__init__.py +41 -0
  14. nuitka/build/inline_copy/pefile/ordlookup/oleaut32.py +400 -0
  15. nuitka/build/inline_copy/pefile/ordlookup/ws2_32.py +120 -0
  16. nuitka/build/static_src/CompiledAsyncgenType.c +2 -11
  17. nuitka/build/static_src/CompiledCodeHelpers.c +4 -2
  18. nuitka/build/static_src/CompiledCoroutineType.c +5 -13
  19. nuitka/build/static_src/CompiledGeneratorType.c +0 -10
  20. nuitka/build/static_src/HelpersConsole.c +1 -1
  21. nuitka/build/static_src/HelpersTypes.c +4 -4
  22. nuitka/build/static_src/MainProgram.c +24 -0
  23. nuitka/build/static_src/MetaPathBasedLoader.c +17 -10
  24. nuitka/build/static_src/OnefileBootstrap.c +3 -1
  25. nuitka/code_generation/TypeAliasCodes.py +3 -2
  26. nuitka/freezer/DllDependenciesMacOS.py +7 -2
  27. nuitka/freezer/DllDependenciesPosix.py +22 -3
  28. nuitka/freezer/DllDependenciesWin32.py +1 -0
  29. nuitka/freezer/IncludedDataFiles.py +1 -1
  30. nuitka/freezer/IncludedEntryPoints.py +8 -0
  31. nuitka/freezer/Standalone.py +11 -2
  32. nuitka/importing/Importing.py +2 -1
  33. nuitka/nodes/ChildrenHavingMixins.py +13 -13
  34. nuitka/nodes/FunctionNodes.py +7 -0
  35. nuitka/nodes/ModuleNodes.py +21 -7
  36. nuitka/nodes/PackageMetadataNodes.py +3 -1
  37. nuitka/nodes/TypeNodes.py +3 -3
  38. nuitka/plugins/PluginBase.py +67 -13
  39. nuitka/plugins/Plugins.py +1 -1
  40. nuitka/plugins/standard/AntiBloatPlugin.py +136 -65
  41. nuitka/plugins/standard/ImplicitImports.py +3 -2
  42. nuitka/plugins/standard/PySidePyQtPlugin.py +13 -0
  43. nuitka/plugins/standard/standard.nuitka-package.config.yml +151 -53
  44. nuitka/reports/Reports.py +25 -2
  45. nuitka/tools/general/find_module/FindModuleCode.py +4 -1
  46. nuitka/tools/scanning/DisplayPackageDLLs.py +5 -6
  47. nuitka/tools/watch/__main__.py +7 -2
  48. nuitka/tree/Building.py +4 -6
  49. nuitka/tree/FutureSpecState.py +71 -0
  50. nuitka/tree/ReformulationAssignmentStatements.py +2 -2
  51. nuitka/tree/ReformulationDictionaryCreation.py +2 -2
  52. nuitka/tree/ReformulationFunctionStatements.py +1 -1
  53. nuitka/tree/ReformulationImportStatements.py +4 -51
  54. nuitka/tree/ReformulationMultidist.py +1 -1
  55. nuitka/tree/ReformulationNamespacePackages.py +27 -5
  56. nuitka/tree/SourceHandling.py +56 -17
  57. nuitka/utils/Distributions.py +26 -6
  58. nuitka/utils/FileOperations.py +18 -6
  59. nuitka/utils/StaticLibraries.py +4 -0
  60. {Nuitka_winsvc-2.6.data → Nuitka_winsvc-2.6.5.data}/scripts/nuitka-run.cmd +0 -0
  61. {Nuitka_winsvc-2.6.data → Nuitka_winsvc-2.6.5.data}/scripts/nuitka.cmd +0 -0
  62. {Nuitka_winsvc-2.6.dist-info → Nuitka_winsvc-2.6.5.dist-info}/LICENSE.txt +0 -0
  63. {Nuitka_winsvc-2.6.dist-info → Nuitka_winsvc-2.6.5.dist-info}/WHEEL +0 -0
  64. {Nuitka_winsvc-2.6.dist-info → Nuitka_winsvc-2.6.5.dist-info}/entry_points.txt +0 -0
  65. {Nuitka_winsvc-2.6.dist-info → Nuitka_winsvc-2.6.5.dist-info}/top_level.txt +0 -0
@@ -87,7 +87,7 @@ def buildDictionaryNode(provider, node, source_ref):
87
87
 
88
88
 
89
89
  @once_decorator
90
- def getDictUnpackingHelper():
90
+ def _getDictUnpackingHelper():
91
91
  helper_name = "_unpack_dict"
92
92
 
93
93
  result = makeInternalHelperFunctionBody(
@@ -272,7 +272,7 @@ def buildDictionaryUnpacking(provider, keys, values, source_ref):
272
272
  result = makeExpressionFunctionCall(
273
273
  function=makeExpressionFunctionCreation(
274
274
  function_ref=ExpressionFunctionRef(
275
- function_body=getDictUnpackingHelper(), source_ref=source_ref
275
+ function_body=_getDictUnpackingHelper(), source_ref=source_ref
276
276
  ),
277
277
  defaults=(),
278
278
  kw_defaults=None,
@@ -54,8 +54,8 @@ from nuitka.plugins.Plugins import Plugins, hasActivePlugin
54
54
  from nuitka.PythonVersions import python_version
55
55
  from nuitka.specs.ParameterSpecs import ParameterSpec
56
56
 
57
+ from .FutureSpecState import getFutureSpec
57
58
  from .ReformulationExecStatements import wrapEvalGlobalsAndLocals
58
- from .ReformulationImportStatements import getFutureSpec
59
59
  from .ReformulationTryFinallyStatements import (
60
60
  makeTryFinallyReleaseStatement,
61
61
  makeTryFinallyStatement,
@@ -12,7 +12,6 @@ source code comments with Developer Manual sections.
12
12
 
13
13
  from nuitka.importing.ImportResolving import resolveModuleName
14
14
  from nuitka.nodes.ConstantRefNodes import makeConstantRefNode
15
- from nuitka.nodes.FutureSpecs import FutureSpec
16
15
  from nuitka.nodes.GlobalsLocalsNodes import ExpressionBuiltinGlobals
17
16
  from nuitka.nodes.ImportNodes import (
18
17
  ExpressionBuiltinImport,
@@ -25,10 +24,10 @@ from nuitka.nodes.StatementNodes import StatementsSequence
25
24
  from nuitka.nodes.VariableAssignNodes import makeStatementAssignmentVariable
26
25
  from nuitka.nodes.VariableNameNodes import StatementAssignmentVariableName
27
26
  from nuitka.nodes.VariableRefNodes import ExpressionTempVariableRef
28
- from nuitka.plugins.Plugins import Plugins
29
27
  from nuitka.PythonVersions import python_version
30
28
  from nuitka.utils.ModuleNames import ModuleName
31
29
 
30
+ from .FutureSpecState import enableFutureFeature, getFutureSpec
32
31
  from .ReformulationTryFinallyStatements import makeTryFinallyReleaseStatement
33
32
  from .SyntaxErrors import raiseSyntaxError
34
33
  from .TreeHelpers import makeStatementsSequenceOrStatement, mangleName
@@ -66,7 +65,7 @@ from __future__ imports must occur at the beginning of the file""",
66
65
  for import_desc in node.names:
67
66
  object_name, _local_name = import_desc.name, import_desc.asname
68
67
 
69
- _enableFutureFeature(node=node, object_name=object_name, source_ref=source_ref)
68
+ enableFutureFeature(node=node, object_name=object_name, source_ref=source_ref)
70
69
 
71
70
  # Remember it for checks to be applied once module is complete, e.g. if
72
71
  # they are all at module start.
@@ -74,52 +73,6 @@ from __future__ imports must occur at the beginning of the file""",
74
73
  _future_import_nodes.append(node)
75
74
 
76
75
 
77
- _future_specs = []
78
-
79
-
80
- def pushFutureSpec(module_name):
81
- _future_specs.append(
82
- FutureSpec(use_annotations=Plugins.decideAnnotations(module_name))
83
- )
84
-
85
-
86
- def getFutureSpec():
87
- return _future_specs[-1]
88
-
89
-
90
- def popFutureSpec():
91
- del _future_specs[-1]
92
-
93
-
94
- def _enableFutureFeature(node, object_name, source_ref):
95
- future_spec = _future_specs[-1]
96
-
97
- if object_name == "unicode_literals":
98
- future_spec.enableUnicodeLiterals()
99
- elif object_name == "absolute_import":
100
- future_spec.enableAbsoluteImport()
101
- elif object_name == "division":
102
- future_spec.enableFutureDivision()
103
- elif object_name == "print_function":
104
- future_spec.enableFuturePrint()
105
- elif object_name == "barry_as_FLUFL" and python_version >= 0x300:
106
- future_spec.enableBarry()
107
- elif object_name == "generator_stop":
108
- future_spec.enableGeneratorStop()
109
- elif object_name == "braces":
110
- raiseSyntaxError("not a chance", source_ref.atColumnNumber(node.col_offset))
111
- elif object_name in ("nested_scopes", "generators", "with_statement"):
112
- # These are enabled in all cases already.
113
- pass
114
- elif object_name == "annotations" and python_version >= 0x370:
115
- future_spec.enableFutureAnnotations()
116
- else:
117
- raiseSyntaxError(
118
- "future feature %s is not defined" % object_name,
119
- source_ref.atColumnNumber(node.col_offset),
120
- )
121
-
122
-
123
76
  def _resolveImportModuleName(module_name):
124
77
  if module_name:
125
78
  module_name = resolveModuleName(ModuleName(module_name)).asString()
@@ -142,7 +95,7 @@ def buildImportFromNode(provider, node, source_ref):
142
95
  # Use default level under some circumstances.
143
96
  if level == -1:
144
97
  level = None
145
- elif level == 0 and not _future_specs[-1].isAbsoluteImport():
98
+ elif level == 0 and not getFutureSpec().isAbsoluteImport():
146
99
  level = None
147
100
 
148
101
  if level is not None:
@@ -311,7 +264,7 @@ def buildImportModulesNode(provider, node, source_ref):
311
264
  # imports.
312
265
  level = (
313
266
  makeConstantRefNode(0, source_ref, True)
314
- if _future_specs[-1].isAbsoluteImport()
267
+ if getFutureSpec().isAbsoluteImport()
315
268
  else None
316
269
  )
317
270
 
@@ -36,7 +36,7 @@ def createMultidistMainSourceCode():
36
36
  source_code = renderTemplateFromString(
37
37
  r"""
38
38
  import sys, re, os
39
- main_basename = re.sub(r'(.pyw?|\.exe|\.bin)?$', '', os.path.normcase(os.path.basename(sys.argv[0])))
39
+ main_basename = re.sub(r'(.pyw?|\.exe|\.bin)?$', '', os.path.normcase(os.path.basename(__compiled__.original_argv0)))
40
40
  {% for main_module_name, main_basename in zip(main_module_names, main_basenames) %}
41
41
  if main_basename == "{{main_basename}}":
42
42
  __import__("{{main_module_name.asString()}}")
@@ -28,7 +28,12 @@ from nuitka.nodes.VariableNameNodes import StatementAssignmentVariableName
28
28
  from nuitka.Options import getFileReferenceMode
29
29
  from nuitka.PythonVersions import python_version
30
30
 
31
- from .TreeHelpers import makeStatementsSequenceFromStatement
31
+ from .FutureSpecState import popFutureSpec, pushFutureSpec
32
+ from .TreeHelpers import (
33
+ buildNode,
34
+ makeStatementsSequenceFromStatement,
35
+ parseSourceCodeToAst,
36
+ )
32
37
  from .VariableClosure import completeVariableClosures
33
38
 
34
39
 
@@ -51,7 +56,7 @@ def _makeCall(module_name, import_name, attribute_name, source_ref, *args):
51
56
  )
52
57
 
53
58
 
54
- def getNameSpacePathExpression(package, source_ref):
59
+ def _getNameSpacePathExpression(package, source_ref):
55
60
  """Create the __path__ expression for a package."""
56
61
 
57
62
  reference_mode = getFileReferenceMode()
@@ -135,12 +140,29 @@ def createPathAssignment(package, source_ref):
135
140
  return StatementAssignmentVariableName(
136
141
  provider=package,
137
142
  variable_name="__path__",
138
- source=getNameSpacePathExpression(package=package, source_ref=source_ref),
143
+ source=_getNameSpacePathExpression(package=package, source_ref=source_ref),
139
144
  source_ref=source_ref,
140
145
  )
141
146
 
142
147
 
148
+ def _getPathFinderFunction(package, source_ref):
149
+ # TODO: This could be a shared helper function, but we currently cannot do these.
150
+ ast_tree = parseSourceCodeToAst(
151
+ source_code="_path_finder = lambda *args, **kw: None",
152
+ module_name=package.getFullName(),
153
+ filename=source_ref.getFilename(),
154
+ line_offset=0,
155
+ )
156
+
157
+ pushFutureSpec(package.getFullName())
158
+ statement = buildNode(package, ast_tree.body[0], source_ref)
159
+ popFutureSpec()
160
+
161
+ return statement.subnode_source
162
+
163
+
143
164
  def createPython3NamespacePath(package, source_ref):
165
+
144
166
  module_name = (
145
167
  "_frozen_importlib" if python_version < 0x350 else "_frozen_importlib_external"
146
168
  )
@@ -167,8 +189,8 @@ def createPython3NamespacePath(package, source_ref):
167
189
  user_provided=True,
168
190
  source_ref=source_ref,
169
191
  ),
170
- getNameSpacePathExpression(package=package, source_ref=source_ref),
171
- makeConstantRefNode(constant=None, source_ref=source_ref),
192
+ _getNameSpacePathExpression(package=package, source_ref=source_ref),
193
+ _getPathFinderFunction(package=package, source_ref=source_ref),
172
194
  ),
173
195
  user_provided=True,
174
196
  source_ref=source_ref,
@@ -16,8 +16,9 @@ from nuitka.__past__ import unicode
16
16
  from nuitka.containers.OrderedSets import OrderedSet
17
17
  from nuitka.plugins.Plugins import Plugins
18
18
  from nuitka.PythonVersions import python_version, python_version_str
19
- from nuitka.Tracing import general, my_print
20
- from nuitka.utils.FileOperations import putTextFileContents
19
+ from nuitka.Tracing import general, inclusion_logger, my_print
20
+ from nuitka.utils.FileOperations import getReportPath, putTextFileContents
21
+ from nuitka.utils.ModuleNames import ModuleName, checkModuleName
21
22
  from nuitka.utils.Shebang import getShebangFromSource, parseShebang
22
23
  from nuitka.utils.Utils import isWin32OrPosixWindows
23
24
 
@@ -310,7 +311,23 @@ def writeSourceCode(filename, source_code):
310
311
  putTextFileContents(filename=filename, contents=source_code, encoding="latin1")
311
312
 
312
313
 
313
- def parsePyIFile(module_name, pyi_filename):
314
+ def _checkAndAddModuleName(pyi_deps, pyi_filename, line_number, candidate):
315
+ if type(candidate) is not ModuleName:
316
+ if (
317
+ not checkModuleName(candidate)
318
+ or candidate.startswith(" ")
319
+ or candidate.endswith(" ")
320
+ ):
321
+ inclusion_logger.warning(
322
+ "Encountered wrong '.pyi' parsing result in '%s:%d' giving illegal module name '%s'."
323
+ % (getReportPath(pyi_filename), line_number, candidate)
324
+ )
325
+ return None
326
+
327
+ pyi_deps.add(ModuleName(candidate))
328
+
329
+
330
+ def parsePyIFile(module_name, package_name, pyi_filename):
314
331
  """Parse a pyi file for the given module name and extract imports made."""
315
332
 
316
333
  # Complex stuff, pylint: disable=too-many-branches,too-many-statements
@@ -329,7 +346,7 @@ def parsePyIFile(module_name, pyi_filename):
329
346
  source_filename=pyi_filename,
330
347
  )
331
348
 
332
- for line in pyi_contents.splitlines():
349
+ for line_number, line in enumerate(pyi_contents.splitlines(), start=1):
333
350
  line = line.strip()
334
351
 
335
352
  if in_quote:
@@ -338,19 +355,22 @@ def parsePyIFile(module_name, pyi_filename):
338
355
 
339
356
  continue
340
357
 
341
- if line.startswith('"""'):
358
+ if line.startswith('"""') and not line.endswith('"""'):
342
359
  in_quote = '"""'
343
360
  continue
344
361
 
345
- if line.startswith("'''"):
362
+ if line.startswith("'''") and not line.endswith("'''"):
346
363
  in_quote = "'''"
347
364
  continue
348
365
 
349
366
  if not in_import:
350
367
  if line.startswith("import "):
351
- imported = line[7:]
352
-
353
- pyi_deps.add(imported)
368
+ _checkAndAddModuleName(
369
+ pyi_deps=pyi_deps,
370
+ pyi_filename=pyi_filename,
371
+ line_number=line_number,
372
+ candidate=line[7:].split("#", 1)[0].strip(),
373
+ )
354
374
  elif line.startswith("from "):
355
375
  parts = line.split(None, 3)
356
376
  assert parts[0] == "from"
@@ -364,7 +384,7 @@ def parsePyIFile(module_name, pyi_filename):
364
384
  continue
365
385
 
366
386
  if origin_name == ".":
367
- origin_name = module_name
387
+ origin_name = package_name
368
388
  else:
369
389
  dot_count = 0
370
390
  while origin_name.startswith("."):
@@ -373,18 +393,23 @@ def parsePyIFile(module_name, pyi_filename):
373
393
 
374
394
  if dot_count > 0:
375
395
  if origin_name:
376
- origin_name = module_name.getRelativePackageName(
396
+ origin_name = package_name.getRelativePackageName(
377
397
  level=dot_count - 1
378
398
  ).getChildNamed(origin_name)
379
399
  else:
380
- origin_name = module_name.getRelativePackageName(
400
+ origin_name = package_name.getRelativePackageName(
381
401
  level=dot_count - 1
382
402
  )
383
403
 
384
404
  if origin_name != module_name:
385
- pyi_deps.add(origin_name)
386
-
387
- imported = parts[3]
405
+ _checkAndAddModuleName(
406
+ pyi_deps=pyi_deps,
407
+ pyi_filename=pyi_filename,
408
+ line_number=line_number,
409
+ candidate=origin_name,
410
+ )
411
+
412
+ imported = parts[3].split("#", 1)[0].strip()
388
413
  if imported.startswith("("):
389
414
  # Handle multiline imports
390
415
  if not imported.endswith(")"):
@@ -405,7 +430,12 @@ def parsePyIFile(module_name, pyi_filename):
405
430
  for name in imported.split(","):
406
431
  if name:
407
432
  name = name.strip()
408
- pyi_deps.add(origin_name + "." + name)
433
+ _checkAndAddModuleName(
434
+ pyi_deps=pyi_deps,
435
+ pyi_filename=pyi_filename,
436
+ line_number=line_number,
437
+ candidate=origin_name + "." + name,
438
+ )
409
439
 
410
440
  else: # In import
411
441
  imported = line
@@ -416,7 +446,16 @@ def parsePyIFile(module_name, pyi_filename):
416
446
  for name in imported.split(","):
417
447
  name = name.strip()
418
448
  if name:
419
- pyi_deps.add(in_import_part + "." + name)
449
+ _checkAndAddModuleName(
450
+ pyi_deps=pyi_deps,
451
+ pyi_filename=pyi_filename,
452
+ line_number=line_number,
453
+ candidate=in_import_part + "." + name,
454
+ )
455
+
456
+ # Rejected module names have become None.
457
+ if None in pyi_deps:
458
+ pyi_deps.remove(None)
420
459
 
421
460
  return pyi_deps
422
461
 
@@ -118,8 +118,9 @@ is typically caused by corruption of its installation."""
118
118
  def _getDistributionMetadataRecordData(distribution):
119
119
  record_data = _getDistributionMetadataFileContents(distribution, "RECORD")
120
120
 
121
- for line in record_data.splitlines():
122
- yield line.split(",")
121
+ if record_data is not None:
122
+ for line in record_data.splitlines():
123
+ yield line.split(",")
123
124
 
124
125
 
125
126
  def _readChunks(file_handle):
@@ -133,10 +134,15 @@ def _readChunks(file_handle):
133
134
  def _makeRecordData(filename):
134
135
  h = hashlib.sha256()
135
136
  length = 0
136
- with open(filename, "rb") as file_handle:
137
- for block in _readChunks(file_handle):
138
- length += len(block)
139
- h.update(block)
137
+
138
+ try:
139
+ with open(filename, "rb") as file_handle:
140
+ for block in _readChunks(file_handle):
141
+ length += len(block)
142
+ h.update(block)
143
+ except IOError:
144
+ pass
145
+
140
146
  digest = "sha256=" + base64.urlsafe_b64encode(h.digest()).decode("latin1").rstrip(
141
147
  "="
142
148
  )
@@ -462,6 +468,20 @@ def isDistributionCondaPackage(distribution_name):
462
468
  return getDistributionInstallerName(distribution_name) == "conda"
463
469
 
464
470
 
471
+ def isDistributionVendored(distribution_name):
472
+ # Only observed case with setuptools so far.
473
+ if getDistributionInstallerName(distribution_name) == "uv":
474
+ path = _getDistributionPath(getDistribution(distribution_name))
475
+
476
+ if path is not None:
477
+ if os.path.dirname(path).endswith(
478
+ (r"setuptools\_vendor", "setuptools/vendor")
479
+ ):
480
+ return True
481
+
482
+ return False
483
+
484
+
465
485
  def isDistributionMsys2Package(distribution_name):
466
486
  if not isAnacondaPython():
467
487
  return False
@@ -690,6 +690,12 @@ def changeFilenameExtension(path, extension):
690
690
  return os.path.splitext(path)[0] + extension
691
691
 
692
692
 
693
+ def switchFilenameExtension(path, old_extension, new_extension):
694
+ """Switch the filename extension specified to another one."""
695
+ assert path.endswith(old_extension)
696
+ return path[: -len(old_extension)] + new_extension
697
+
698
+
693
699
  def hasFilenameExtension(path, extensions):
694
700
  """Has a filename one of the given extensions.
695
701
 
@@ -999,6 +1005,17 @@ def copyTree(source_path, dest_path):
999
1005
  return copy_tree(source_path, dest_path)
1000
1006
 
1001
1007
 
1008
+ def resolveSymlink(path):
1009
+ """Resolve a symlink, to a relative path."""
1010
+ link_source_abs = os.path.abspath(path)
1011
+ link_target_abs = os.path.abspath(
1012
+ os.path.join(os.path.dirname(path), os.readlink(path))
1013
+ )
1014
+ link_target_rel = relpath(link_target_abs, os.path.dirname(link_source_abs))
1015
+
1016
+ return link_target_rel
1017
+
1018
+
1002
1019
  def copyFileWithPermissions(source_path, dest_path, dist_dir):
1003
1020
  """Improved version of shutil.copy2 for putting things to dist folder
1004
1021
 
@@ -1007,12 +1024,7 @@ def copyFileWithPermissions(source_path, dest_path, dist_dir):
1007
1024
  """
1008
1025
 
1009
1026
  if os.path.islink(source_path) and not isWin32Windows():
1010
- link_source_abs = os.path.abspath(source_path)
1011
- link_target_abs = os.path.abspath(
1012
- os.path.join(os.path.dirname(source_path), os.readlink(source_path))
1013
- )
1014
-
1015
- link_target_rel = relpath(link_target_abs, os.path.dirname(link_source_abs))
1027
+ link_target_rel = resolveSymlink(source_path)
1016
1028
 
1017
1029
  if isFilenameBelowPath(
1018
1030
  path=dist_dir,
@@ -14,6 +14,7 @@ from nuitka.PythonFlavors import (
14
14
  isNuitkaPython,
15
15
  isRyePython,
16
16
  isSelfCompiledPythonUninstalled,
17
+ isUvPython,
17
18
  )
18
19
  from nuitka.PythonVersions import (
19
20
  getPythonABI,
@@ -157,6 +158,9 @@ def _getSystemStaticLibPythonPath():
157
158
  if isMacOS() and isRyePython():
158
159
  return None
159
160
 
161
+ if isUvPython():
162
+ return None
163
+
160
164
  if isSelfCompiledPythonUninstalled():
161
165
  candidate = os.path.join(sys_prefix, "libpython" + python_abi_version + ".a")
162
166