Bagaimana cara memasukkan kode Python eksternal untuk digunakan di file lain?

117

Jika Anda memiliki sekumpulan metode dalam sebuah file, apakah ada cara untuk menyertakan file tersebut di file lain, tetapi memanggilnya tanpa awalan apa pun (mis. Awalan file)?

Jadi jika saya memiliki:

[Math.py]
def Calculate ( num )

Bagaimana cara menyebutnya seperti ini:

[Tool.py]
using Math.py

for i in range ( 5 ) :
    Calculate ( i )
Joan Venge
sumber

Jawaban:

154

Anda perlu mengimpor file lain sebagai modul seperti ini:

import Math

Jika Anda tidak ingin mengawali Calculatefungsi Anda dengan nama modul, lakukan ini:

from Math import Calculate

Jika Anda ingin mengimpor semua anggota modul, lakukan ini:

from Math import *

Sunting: Ini adalah bab bagus dari Dive Into Python yang membahas sedikit lebih dalam tentang topik ini.

Andrew Hare
sumber
9
Perlu dicatat bahwa from Math import *ini tidak dianjurkan .
n nothing101
1
Anda mungkin menarik impmodul dan panggilan ajaib __import__.
Vitold S.
Seseorang lupa memperbarui domainnya: \
Spechal
48

Cukup tulis perintah "sertakan":

import os

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


include('myfile.py')

@Dele:

Komentar @bfieck benar, untuk kompatibilitas python 2 dan 3, Anda memerlukan:

Python 2 dan 3: alternatif 1

from past.builtins import execfile

execfile('myfile.py')

Python 2 dan 3: alternatif 2

exec(compile(open('myfile.py').read()))
Louis
sumber
3
Apakah ada alasan untuk melakukan ini from module import *? Juga, jika file yang Anda panggil memiliki kode di badannya, kode itu akan dijalankan, jika Anda melakukan ini.
ada101
4
@ naught101: Itulah tujuan: menjalankan kode, yang tidak terjadi dengan impor. Biasanya itu hanya mendefinisikan variabel.
Louis
2
@Deleet python 3 tidak memilikiexecfile
bfieck
7
Sebenarnya python 3 memiliki signature lain compile()dari yang disebutkan. Jadi Python 2 dan 3 yang benar: alternatif 2 adalah:exec(compile(source=open('myfile.py').read(), filename='myfile.py', mode='exec'))
TriAnMan
3
Fungsi pembantu 'sertakan' tidak berfungsi jika Anda ingin memiliki variabel dalam file yang disertakan dalam cakupan di pemanggil 'sertakan'
paulj
35

Jika Anda menggunakan:

import Math

maka itu akan memungkinkan Anda untuk menggunakan fungsi Math, tetapi Anda harus melakukan Math.Calculate, jadi itu jelas yang tidak Anda inginkan.

Jika Anda ingin mengimpor fungsi modul tanpa harus memberi awalan, Anda harus menamainya secara eksplisit, seperti:

from Math import Calculate, Add, Subtract

Sekarang, Anda bisa mereferensikan Hitung, Tambah, dan Kurangi hanya dengan namanya. Jika Anda ingin mengimpor SEMUA fungsi dari Matematika, lakukan:

from Math import *

Namun, Anda harus sangat berhati-hati saat melakukan ini dengan modul yang isinya Anda tidak yakin. Jika Anda mengimpor dua modul yang berisi definisi untuk nama fungsi yang sama, satu fungsi akan menimpa yang lain, tanpa Anda yang lebih bijak.

ryeguy
sumber
1

Saya telah menemukan modul inspeksi python sangat berguna

Misalnya dengan teststuff.py

import inspect

def dostuff():
    return __name__

DOSTUFF_SOURCE = inspect.getsource(dostuff)

if __name__ == "__main__":

    dostuff()

Dan dari skrip lain atau konsol python

import teststuff

exec(DOSTUFF_SOURCE)

dostuff()

Dan sekarang dostuff harus berada dalam cakupan lokal dan dostuff () akan mengembalikan konsol atau skrip _ name _ sedangkan menjalankan test.dostuff () akan mengembalikan nama modul python.

whardier
sumber