diff --git a/lib/modules/manager/pip-compile/extract.ts b/lib/modules/manager/pip-compile/extract.ts
index 40296061223521a157de19782ec68ed93cd90977..e3624ffc6807aa2af906ada46e89682728b1e8cf 100644
--- a/lib/modules/manager/pip-compile/extract.ts
+++ b/lib/modules/manager/pip-compile/extract.ts
@@ -1,4 +1,3 @@
-import { Graph } from 'graph-data-structure';
 import { logger } from '../../../logger';
 import { readLocalFile } from '../../../util/fs';
 import { normalizeDepName } from '../../datasource/pypi/common';
@@ -11,7 +10,7 @@ import type {
   PipCompileArgs,
   SupportedManagers,
 } from './types';
-import { generateMermaidGraph } from './utils';
+import { generateMermaidGraph, sortPackageFiles } from './utils';
 
 function matchManager(filename: string): SupportedManagers | 'unknown' {
   if (filename.endsWith('setup.py')) {
@@ -178,32 +177,10 @@ export async function extractAllPackageFiles(
   if (packageFiles.size === 0) {
     return null;
   }
-  const result: PackageFile[] = [];
-  const graph: ReturnType<typeof Graph> = Graph();
-  depsBetweenFiles.forEach(({ sourceFile, outputFile }) => {
-    graph.addEdge(sourceFile, outputFile);
-  });
-  const sorted = graph.topologicalSort();
-  for (const file of sorted) {
-    if (packageFiles.has(file)) {
-      const packageFile = packageFiles.get(file)!;
-      const sortedLockFiles = [];
-      // TODO(not7cd): this needs better test case
-      for (const lockFile of packageFile.lockFiles!) {
-        if (sorted.includes(lockFile)) {
-          sortedLockFiles.push(lockFile);
-        }
-      }
-      packageFile.lockFiles = sortedLockFiles;
-      result.push(packageFile);
-    }
-  }
-  // istanbul ignore if: should never happen
-  if (result.length !== packageFiles.size) {
-    throw new Error(
-      'pip-compile: topological sort failed to include all package files',
-    );
-  }
+  const result: PackageFile[] = sortPackageFiles(
+    depsBetweenFiles,
+    packageFiles,
+  );
   logger.debug(
     'pip-compile: dependency graph:\n' +
       generateMermaidGraph(depsBetweenFiles, lockFileArgs),
diff --git a/lib/modules/manager/pip-compile/utils.ts b/lib/modules/manager/pip-compile/utils.ts
index 347fe4f24dc0f29586e9fbb46e06031a113c2a27..d87a53e53f13cac18d4df6fadde1543a8e20feb1 100644
--- a/lib/modules/manager/pip-compile/utils.ts
+++ b/lib/modules/manager/pip-compile/utils.ts
@@ -1,5 +1,38 @@
+import { Graph } from 'graph-data-structure';
+import type { PackageFile } from '../types';
 import type { DependencyBetweenFiles, PipCompileArgs } from './types';
 
+export function sortPackageFiles(
+  depsBetweenFiles: DependencyBetweenFiles[],
+  packageFiles: Map<string, PackageFile>,
+): PackageFile[] {
+  const result: PackageFile[] = [];
+  const graph: ReturnType<typeof Graph> = Graph();
+  depsBetweenFiles.forEach(({ sourceFile, outputFile }) => {
+    graph.addEdge(sourceFile, outputFile);
+  });
+  const sorted = graph.topologicalSort();
+  for (const file of sorted) {
+    if (packageFiles.has(file)) {
+      const packageFile = packageFiles.get(file)!;
+      const sortedLockFiles = [];
+      // TODO(not7cd): this needs better test case
+      for (const lockFile of packageFile.lockFiles!) {
+        if (sorted.includes(lockFile)) {
+          sortedLockFiles.push(lockFile);
+        }
+      }
+      packageFile.lockFiles = sortedLockFiles;
+      result.push(packageFile);
+    }
+  }
+  // istanbul ignore if: should never happen
+  if (result.length !== packageFiles.size) {
+    throw new Error('Topological sort failed to include all package files');
+  }
+  return result;
+}
+
 export function generateMermaidGraph(
   depsBetweenFiles: DependencyBetweenFiles[],
   lockFileArgs: Map<string, PipCompileArgs>,