@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
70 lines (61 loc) • 1.99 kB
text/typescript
import { exec } from 'node:child_process';
import { promisify } from 'node:util';
import { InstallationChecker, PackageInstallCheckResult } from '../types';
const execPromise = promisify(exec);
/**
* Python Installation Checker
*/
export class PythonInstallationChecker implements InstallationChecker {
/**
* Check if Python package is installed
*/
async checkPackageInstalled(details: {
packageName?: string;
pythonCommand?: string;
}): Promise<PackageInstallCheckResult> {
if (!details.packageName) {
return {
error: 'Package name not provided',
installed: false,
packageName: '',
};
}
try {
const packageName = details.packageName;
const pythonCommand = details.pythonCommand || 'python';
// Use pip list to check if package is installed
const command = `${pythonCommand} -m pip list | grep -i "${packageName}"`;
const { stdout } = await execPromise(command);
// If there's output and it contains the package name, consider it installed
if (stdout.trim() && stdout.toLowerCase().includes(packageName.toLowerCase())) {
return {
installed: true,
packageName,
};
}
// Try to directly import the package to verify
const importCommand = `${pythonCommand} -c "import ${packageName.replace('-', '_')}; print('Package installed')"`;
try {
const { stdout: importStdout } = await execPromise(importCommand);
if (importStdout.includes('Package installed')) {
return {
installed: true,
packageName,
};
}
} catch {
// Import failed, package may not exist
}
return {
installed: false,
packageName,
};
} catch (error) {
return {
error: error instanceof Error ? error.message : 'Unknown error',
installed: false,
packageName: details.packageName,
};
}
}
}