2013-01-24 19 views
11

Ho un codice in un progetto che vorrei riutilizzare in un altro progetto. Cosa devo fare (in entrambe le cartelle) in modo che possa farlo?Come importare le funzioni da altri progetti in Python?

La struttura di directory è qualcosa di simile:

  • Foo
    • Project1
      • file1.py
      • file2.py
  • Bar
    • Project2
      • fileX.py
      • fileY.py

Voglio utilizzare le funzioni da file1.py e file2.py in fileX.py e fileY.py .

risposta

18

Idealmente entrambi i progetti saranno un pacchetto python installabile, pieno di __init__.py e setup.py. Potrebbero quindi essere installati con python setup.py install o simili.

Se ciò non è possibile, non utilizzare execfile()! Manipolare PYTHONPATH per aggiungere Foo in modo che import Project1.file1 funzioni.

Ad esempio, da Progetto2/fileX.py:

from os import path 
import sys 
sys.path.append(path.abspath('../Foo')) 

from Project1.file1 import something 

Tuttavia, la vera risposta è quello di rendere ciascuno un pacchetto installabile discreto.

+0

Project1 e Project2 sono entrambi sul mio server con entrambe le versioni controllate. Se Project1 viene aggiornato, quindi dovrò aggiornare il pacchetto installato ogni volta su project2. Ma, se manipolo il mio sys.path, semplicemente facendo un git pull su Project1 aggiornerò il mio modulo. Sto facendo qualcosa di puzzolente? O va bene farlo! Grazie! – Abhishek

5

Si consiglia di creare un module e quindi importare tutto ciò che è necessario da esso.

0

Penso che sia possibile aggiungereal percorso Python corrente utilizzando os.path.join() o os.path.append() e fare from import Project1.file1 import function_name.

+1

Le modifiche a Project1 in un caso come questo tendono a interrompere spuratamente Project2. Non è una buona idea. È necessario trasformarlo in un modulo e avere versioni con versioni. –

+1

Questa è la soluzione letterale al problema. Potrebbero esserci altri (migliori) modi per farlo, incluso quello che hai suggerito. –

0

Si prende il codice che si desidera utilizzare in entrambi i progetti e lo si inserisce in un module, che si estrae in un terzo progetto separato. Quel progetto che fai in un pacchetto, su cui puoi lavorare separatamente. A questo punto, rilascialo la versione e riutilizzala negli altri tuoi progetti.

È importante disporre di versioni da "rilasciare" in modo da poter tenere traccia della versione del modulo utilizzata da ciascun progetto. Altrimenti finirai in una situazione in cui un vecchio progetto smette di funzionare perché hai apportato modifiche incompatibili al modulo comune.

Se è genericamente utilizzabile non solo per voi ma per gli altri, è consigliabile caricarlo su PyPI.

5

C'è molto da fare qui. dovresti leggere i pacchetti Python e la gestione dei moduli http://docs.python.org/2/tutorial/modules.html#packages ma l'idea di base è che fileX abbia bisogno di sapere dove sono file1 e file2 per usarli.

Per trasformare una cartella in un pacchetto, è sufficiente contenere un file __init__.py. Quello che ti suggerisco di fare è (in un terminale)

$ touch Foo/__init__.py 
$ touch Foo/Project1/__init__.py 

(presumendo che tu stia usando unix/linux).

Quindi, in qualche modo, fileX deve sapere dove si trova il pacchetto Foo. È possibile chiamare sys.path.append(PATH) dove PATH è la posizione di Foo.

infine all'interno di fileX.py avresti

import sys 
sys.path.append(PATH) #replace PATH with the path to Foo 

from Foo.Project1 import file1 

#use its functions 
file1.function_name(argument) 

se si vuole veramente dire solo function_name senza la precedente file1. è possibile importare tutte le sue funzioni dicendo from Foo.Project1.file1 import * tuttavia prega di notare chefrom module import * è altamente visto di buon occhio, come si mescola i nomi e rendono il codice meno leggibile e comprensibile

Problemi correlati