Qual è il modo migliore per verificare la disponibilità di applicazioni esterne?
-
03-07-2019 - |
Domanda
Ho un'applicazione che ha degli extra opzionali a seconda che l'utente abbia installato il software.
Su Linux qual è il modo migliore per determinare se è installato qualcosa come Python e PyUsb?
Sto sviluppando un'applicazione Q ++ C ++ se questo aiuta.
Soluzione
Questo è inefficiente (richiede il fork e l'esecuzione di / bin / sh ). Deve esserci un modo migliore! Ma come approccio generico ... c'è sempre system () .
(Ricorda di usare WEXITSTATUS () ! Fai attenzione a rendere i programmi ininterrotti!)
#define SHOW(X) cout << # X " = " << (X) << endl
int main()
{
int status;
SHOW( status = system( "which grep > /dev/null 2>&1" ) );
SHOW( WEXITSTATUS(status) );
SHOW( status = system( "which no_matching_file > /dev/null 2>&1" ) );
SHOW( WEXITSTATUS(status) );
}
Esiste anche popen () , che può essere utile per catturare l'output di programmi per verificare numeri di versione, librerie o quant'altro.
Se hai bisogno di un accesso bidirezionale (lettura e scrittura) a un sottoprocesso, è meglio usare pipe () , fork () , exec () , close () , & amp; dup2 () .
Altri suggerimenti
È possibile richiedere che si trovino nel percorso, ecc. Verificare l'esistenza dei file eseguibili richiesti (utilizzando quale
o simili). Puoi anche utilizzare gli argomenti dei file eseguibili e verificare anche le versioni richieste, se necessario.
Non sono a conoscenza di un modo per farlo per Linux in generale, poiché ogni distribuzione può avere il proprio gestore di pacchetti. Ma supponendo che tu voglia supportare le distro più popolari, puoi interrogare il loro gestore di pacchetti per il software installato (suggerirei come inizio per supportare apt-get, rpm e yum) e analizzare l'output per cercare i pacchetti che riconosci. Ogni gestore ha un modo per elencare i pacchetti installati, il mio suggerimento come inizio:
apt-get --no-act check
rpm -qa
yum list installed
Un'altra possibilità è quella di presentare tutte le funzionalità all'utente e chiedere loro di installare extra se tentano di usarle (ad es. vedi http://0install.net ).