Come includere codice Python esterno da utilizzare in altri file?


117

Se hai una raccolta di metodi in un file, c'è un modo per includere quei file in un altro file, ma chiamarli senza alcun prefisso (cioè prefisso file)?

Quindi se ho:

[Math.py]
def Calculate ( num )

Come lo chiamo in questo modo:

[Tool.py]
using Math.py

for i in range ( 5 ) :
    Calculate ( i )

Risposte:


154

Dovrai importare l'altro file come modulo come questo:

import Math

Se non vuoi anteporre alla tua Calculatefunzione il nome del modulo, fallo:

from Math import Calculate

Se vuoi importare tutti i membri di un modulo, fai questo:

from Math import *

Modifica: ecco un buon capitolo di Dive Into Python che va un po 'più in profondità su questo argomento.


9
Vale la pena notare che nonfrom Math import * è raccomandato .
nought101

1
Puoi impmodulo interessante e chiamata magica __import__.
Vitold S.

Qualcuno ha dimenticato di rinnovare il proprio dominio: \
Spechal

48

Basta scrivere il comando "include":

import os

def include(filename):
    if os.path.exists(filename): 
        execfile(filename)


include('myfile.py')

@Deleet:

L'osservazione @bfieck è corretta, per la compatibilità con Python 2 e 3, è necessario:

Python 2 e 3: alternativa 1

from past.builtins import execfile

execfile('myfile.py')

Python 2 e 3: alternativa 2

exec(compile(open('myfile.py').read()))

3
C'è qualche motivo per farlo from module import *? Inoltre, se il file che stai chiamando ha codice nel corpo, quel codice verrà eseguito, se lo fai.
nought101

4
@ naught101: Questo è l'obiettivo: eseguire il codice, cosa che non avviene con un'importazione. Di solito si tratta solo di definire le variabili.
Louis

2
@Deleet python 3 non haexecfile
bfieck

7
In realtà python 3 ha un'altra firma per compile()quanto menzionato. Quindi il Python 2 e 3 corretto: l'alternativa 2 sarà:exec(compile(source=open('myfile.py').read(), filename='myfile.py', mode='exec'))
TriAnMan

3
La funzione di supporto "include" non funziona se si desidera avere variabili nel file incluso nell'ambito del chiamante di "include"
paulj

35

Se utilizzi:

import Math

allora questo ti permetterà di usare le funzioni di Math, ma devi fare Math.Calculate, quindi è ovviamente quello che non vuoi.

Se vuoi importare le funzioni di un modulo senza doverle anteporre, devi nominarle esplicitamente, come:

from Math import Calculate, Add, Subtract

Ora puoi fare riferimento a Calcola, Aggiungi e Sottrai solo con i loro nomi. Se vuoi importare TUTTE le funzioni da Math, fai:

from Math import *

Tuttavia, dovresti stare molto attento quando lo fai con moduli di cui non sei sicuro. Se importi due moduli che contengono definizioni per lo stesso nome di funzione, una funzione sovrascriverà l'altra, senza che tu sia più saggio.


1

Ho trovato molto utile il modulo Python Inspect

Ad esempio con teststuff.py

import inspect

def dostuff():
    return __name__

DOSTUFF_SOURCE = inspect.getsource(dostuff)

if __name__ == "__main__":

    dostuff()

E da un altro script o dalla console Python

import teststuff

exec(DOSTUFF_SOURCE)

dostuff()

E ora dostuff dovrebbe essere nello scope locale e dostuff () restituirà la console o gli script _ name _ mentre l'esecuzione di test.dostuff () restituirà il nome dei moduli python.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.