Jak dołączyć zewnętrzny kod Pythona do wykorzystania w innych plikach?

117

Jeśli masz kolekcję metod w pliku, czy istnieje sposób na włączenie tych plików do innego pliku, ale wywołanie ich bez żadnego przedrostka (tj. Przedrostka pliku)?

Więc jeśli mam:

[Math.py]
def Calculate ( num )

Jak to nazwać w ten sposób:

[Tool.py]
using Math.py

for i in range ( 5 ) :
    Calculate ( i )
Joan Venge
źródło

Odpowiedzi:

154

Będziesz musiał zaimportować drugi plik jako moduł w następujący sposób:

import Math

Jeśli nie chcesz poprzedzać swojej Calculatefunkcji nazwą modułu, zrób tak:

from Math import Calculate

Jeśli chcesz zaimportować wszystkich członków modułu, zrób to:

from Math import *

Edycja: Oto dobry rozdział z Dive Into Python, który zawiera nieco więcej szczegółów na ten temat.

Andrew Hare
źródło
9
Warto zauważyć, że niefrom Math import * jest to zalecane .
naught101
1
Możesz ciekawy impmoduł i magiczne połączenie __import__.
Vitold S.
Ktoś zapomniał odnowić swoją domenę: \
Przemówienie
48

Po prostu napisz polecenie „włącz”:

import os

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


include('myfile.py')

@Deleet:

Uwaga @bfieck jest poprawna, dla kompatybilności z Pythonem 2 i 3 potrzebujesz albo:

Python 2 i 3: alternatywa 1

from past.builtins import execfile

execfile('myfile.py')

Python 2 i 3: alternatywa 2

exec(compile(open('myfile.py').read()))
Louis
źródło
3
Czy jest jakiś powód, żeby to powtórzyć from module import *? Ponadto, jeśli wywoływany plik ma kod w treści, ten kod zostanie uruchomiony, jeśli to zrobisz.
naught101
4
@ naught101: To jest cel: uruchomienie kodu, co nie ma miejsca w przypadku importu. Zwykle jest to po prostu definiowanie zmiennych.
Louis,
2
@Deleet python 3 nie maexecfile
bfieck
7
Właściwie Python 3 ma inny podpis compile()niż wspomniano. Więc poprawne Python 2 i 3: alternatywa 2 to:exec(compile(source=open('myfile.py').read(), filename='myfile.py', mode='exec'))
TriAnMan
3
Funkcja pomocnicza „include” nie działa, jeśli chcesz, aby zmienne w dołączonym pliku znajdowały się w zakresie w funkcji wywołującej funkcję „include”
paulj
35

Jeśli użyjesz:

import Math

to pozwoli ci korzystać z funkcji Math, ale musisz wykonać Math.Calculate, więc oczywiście tego nie chcesz.

Jeśli chcesz zaimportować funkcje modułu bez konieczności przedrostków, musisz jawnie nazwać je, na przykład:

from Math import Calculate, Add, Subtract

Teraz możesz odwoływać się do funkcji Oblicz, Dodaj i Odejmij, używając tylko ich nazw. Jeśli chcesz zaimportować WSZYSTKIE funkcje z Math, zrób:

from Math import *

Należy jednak być bardzo ostrożnym, robiąc to z modułami, których zawartości nie jesteś pewien. Jeśli zaimportujesz dwa moduły, które zawierają definicje dla tej samej nazwy funkcji, jedna funkcja nadpisze drugą, a Ty nic nie będzie mądrzejsze.

ryeguy
źródło
1

Zauważyłem, że moduł Python inspect jest bardzo przydatny

Na przykład z teststuff.py

import inspect

def dostuff():
    return __name__

DOSTUFF_SOURCE = inspect.getsource(dostuff)

if __name__ == "__main__":

    dostuff()

I z innego skryptu lub konsoli Pythona

import teststuff

exec(DOSTUFF_SOURCE)

dostuff()

A teraz dostuff powinien znajdować się w zasięgu lokalnym, a dostuff () zwróci konsolę lub skrypty _ nazwa _, podczas gdy wykonanie test.dostuff () zwróci nazwę modułu Pythona.

Whardier
źródło