2016-01-20 13 views
6

Ho molti pacchetti python, scritti dai miei colleghi e voglio scrivere uno strumento per verificare su quali terzi si affidano.Elenca tutti i pacchetti di terze parti e le loro stesse funzioni utilizzate in un file Python

Ti piace questa

#it is my package, need to check,call it example.py 
#We have more than one way to import a package, It is a problem need to consider too 

from third_party_packages import third_party_function 

def my_function(arg): 
    return third_party_function(arg) 

e lo strumento dovrebbe funzionare come questo

result = tool(example.py) 
#this result should be a dict like this structure 
#{"third_party_function":["my_function",]} 
#Means "my_function" relies on "third_party_function" 

non ho idea di come fare, tutto quello che può venire l'attuazione di questo strumento è leggere un file Python linea per riga come stringa, e usa regex per confrontarla. Potresti darmi qualche consiglio?

Se non si sa cosa intendo, si prega di commentare la tua domanda, lo aggiusterò il prima possibile. Grazie!

+1

Se si dispone di un ambiente di lavoro, ovvero di tutti i pacchetti installati nella propria installazione python, è possibile utilizzare 'pip' come' pip freeze> requirements.pip' per creare il file 'requirements.pip' che elenca tutti i pacchetti installati (indirettamente i pacchetti è necessario eseguire il progetto) –

+0

Questa non è una domanda facile a cui rispondere. –

+0

Grazie per il vostro consiglio, purtroppo, non tutti i pacchetti installati da pip, alcuni pacchetti scritti da noi stessi. Devo occuparmene. – Fudun

risposta

3

È possibile analizzare i file con il modulo ast e controllare tutte le dichiarazioni Import e ImportFrom.

Per darvi un'idea, ecco un esempio:

>>> import ast 
>>> tree = ast.parse('import a; from b import c') 
>>> tree.body 
[<_ast.Import object at 0x7f3041263860>, <_ast.ImportFrom object at 0x7f3041262c18>] 
>>> tree.body[0].names[0].name 
'a' 
>>> tree.body[1].module 
'b' 
>>> tree.body[1].names[0].name 
'c' 

Lo script potrebbe funzionare in questo modo:

  1. analizzare il file sorgente tramite ast.parse
  2. visita ogni nodo utilizzando ast.walk()
  3. Se un nodo è un oggetto Import o ImportFrom, quindi ispezionare i nomi e fare ciò che si ha fare.

L'utilizzo di ast è molto più semplice e robusto delle espressioni regolari o di un parser personalizzato.

+0

Grazie mille, e sembra funzionare per me ~ I lo testerò domani arriveremo immediatamente in ufficio ~ E posterò il risultato ~ – Fudun

+0

Funziona per me! Grazie mille! – Fudun

Problemi correlati