Bagaimana cara mengimpor file Python lainnya?


799

Bagaimana cara mengimpor file lain dengan Python?

  1. Bagaimana tepatnya saya dapat mengimpor file python tertentu import file.py?
  2. Bagaimana saya bisa mengimpor folder daripada file tertentu?
  3. Saya ingin memuat file Python secara dinamis saat runtime, berdasarkan input pengguna.
  4. Saya ingin tahu cara memuat hanya satu bagian tertentu dari file.

Misalnya, di main.pysaya punya:

from extra import * 

Meskipun ini memberi saya semua definisi extra.py, ketika mungkin semua yang saya inginkan adalah definisi tunggal:

def gap():
    print
    print

Apa yang harus saya tambahkan ke importpernyataan untuk hanya mendapatkan gapdari extra.py?


Jawaban:


443

importlibditambahkan ke Python 3 untuk secara terprogram mengimpor modul. Itu hanya pembungkus __import__, lihat dokumen .

import importlib

moduleName = input('Enter module name:')
importlib.import_module(moduleName)

Catatan: .pyekstensi harus dihapus dari moduleName. Fungsi ini juga mendefinisikan packageargumen untuk impor relatif.


Pembaruan: Jawaban di bawah ini sudah usang . Gunakan alternatif yang lebih baru di atas.

  1. Hanya import filetanpa ekstensi '.py'.

  2. Anda dapat menandai folder sebagai paket, dengan menambahkan file kosong bernama __init__.py.

  3. Anda dapat menggunakan __import__fungsi ini. Dibutuhkan nama modul sebagai string. (Lagi: nama modul tanpa ekstensi '.py'.)

    pmName = input('Enter module name:')
    pm = __import__(pmName)
    print(dir(pm))

    Ketik help(__import__)untuk detail lebih lanjut.


7
Jika Anda menambahkan import filenameke init .py maka Anda dapat mengimpor modul secara langsung sebagai nama folder.
CornSmith

9
dari help(__import__):Because this function is meant for use by the Python interpreter and not for general use it is better to use importlib.import_module() to programmatically import a module.
Tadhg McDonald-Jensen

6
Bagaimana jika itu bukan paket tetapi hanya file skrip?
Jonathan

3
Untuk mengimpor file skrip di jalur yang sama (mungkin juga akan berfungsi untuk file skrip di jalur pencarian Python), import filenamenoextberfungsi dengan baik untuk saya, dengan Python 3.4.8.
Alex Hall

7
Apakah masih akurat pada 2019? Apakah python3 atau 2?
Sandburg

1032

Ada banyak cara untuk mengimpor file python, semuanya dengan pro dan kontra mereka.

Jangan hanya cepat-cepat memilih strategi impor pertama yang bekerja untuk Anda atau Anda harus menulis ulang basis kode nanti ketika Anda menemukan itu tidak memenuhi kebutuhan Anda.

Saya akan mulai menjelaskan contoh paling mudah # 1, lalu saya akan beralih ke contoh paling profesional dan kuat # 7

Contoh 1, Impor modul python dengan juru bahasa python:

  1. Masukkan ini ke /home/el/foo/fox.py:

    def what_does_the_fox_say():
      print("vixens cry")
  2. Masuk ke juru bahasa python:

    el@apollo:/home/el/foo$ python
    Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
    >>> import fox
    >>> fox.what_does_the_fox_say()
    vixens cry
    >>> 

    Anda mengimpor fox melalui interpreter python, memanggil fungsi python what_does_the_fox_say()dari dalam fox.py.

Contoh 2, Gunakan execfileatau ( execdalam Python 3 ) dalam skrip untuk menjalankan file python lain di tempatnya:

  1. Masukkan ini ke /home/el/foo2/mylib.py:

    def moobar():
      print("hi")
  2. Letakkan ini di /home/el/foo2/main.py:

    execfile("/home/el/foo2/mylib.py")
    moobar()
  3. jalankan file:

    el@apollo:/home/el/foo$ python main.py
    hi

    Fungsi moobar diimpor dari mylib.py dan tersedia di main.py

Contoh 3, Gunakan dari ... impor ... fungsionalitas:

  1. Masukkan ini ke /home/el/foo3/chekov.py:

    def question():
      print "where are the nuclear wessels?"
  2. Letakkan ini di /home/el/foo3/main.py:

    from chekov import question
    question()
  3. Jalankan seperti ini:

    el@apollo:/home/el/foo3$ python main.py 
    where are the nuclear wessels?

    Jika Anda mendefinisikan fungsi lain di chekov.py, mereka tidak akan tersedia kecuali Anda import *

Contoh 4, Impor riaa.py jika berada di lokasi file yang berbeda dari tempat diimpor

  1. Masukkan ini ke /home/el/foo4/stuff/riaa.py:

    def watchout():
      print "computers are transforming into a noose and a yoke for humans"
  2. Masukkan ini ke /home/el/foo4/main.py:

    import sys 
    import os
    sys.path.append(os.path.abspath("/home/el/foo4/stuff"))
    from riaa import *
    watchout()
  3. Menjalankannya:

    el@apollo:/home/el/foo4$ python main.py 
    computers are transforming into a noose and a yoke for humans

    Itu mengimpor segala sesuatu di file asing dari direktori yang berbeda.

Contoh 5, gunakan os.system("python yourfile.py")

import os
os.system("python yourfile.py")

Contoh 6, impor file Anda dengan membonceng python startuphook:

Memperbarui: Contoh ini digunakan untuk python2 dan 3, tetapi sekarang hanya berfungsi untuk python2. python3 menyingkirkan set fitur startuphook pengguna ini karena disalahgunakan oleh penulis perpustakaan python keterampilan rendah, menggunakannya untuk menyuntikkan kode mereka ke dalam namespace global, sebelum semua program yang ditentukan pengguna. Jika Anda ingin ini berfungsi untuk python3, Anda harus menjadi lebih kreatif. Jika saya memberi tahu Anda cara melakukannya, pengembang python juga akan menonaktifkan set fitur itu, sehingga Anda dapat melakukannya sendiri.

Lihat: https://docs.python.org/2/library/user.html

Masukkan kode ini ke direktori home Anda di ~/.pythonrc.py

class secretclass:
    def secretmessage(cls, myarg):
        return myarg + " is if.. up in the sky, the sky"
    secretmessage = classmethod( secretmessage )

    def skycake(cls):
        return "cookie and sky pie people can't go up and "
    skycake = classmethod( skycake )

Masukkan kode ini ke main.py Anda (bisa di mana saja):

import user
msg = "The only way skycake tates good" 
msg = user.secretclass.secretmessage(msg)
msg += user.secretclass.skycake()
print(msg + " have the sky pie! SKYCAKE!")

Jalankan, Anda harus mendapatkan ini:

$ python main.py
The only way skycake tates good is if.. up in the sky, 
the skycookie and sky pie people can't go up and  have the sky pie! 
SKYCAKE!

Jika Anda mendapatkan kesalahan di sini: ModuleNotFoundError: No module named 'user' maka itu berarti Anda menggunakan python3, startuphooks dinonaktifkan di sana secara default.

Kredit untuk jist ini jatuh ke: https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py Kirim sepanjang kapal Anda.

Contoh 7, Most Robust: Mengimpor file dalam python dengan perintah bare import:

  1. Buat direktori baru /home/el/foo5/
  2. Buat direktori baru /home/el/foo5/herp
  3. Buat file kosong bernama di __init__.pybawah herp:

    el@apollo:/home/el/foo5/herp$ touch __init__.py
    el@apollo:/home/el/foo5/herp$ ls
    __init__.py
  4. Buat direktori baru / home / el / foo5 / herp / derp

  5. Di bawah derp, buat __init__.pyfile lain :

    el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
    el@apollo:/home/el/foo5/herp/derp$ ls
    __init__.py
  6. Di bawah / home / el / foo5 / herp / derp buat file baru bernama yolo.pyLetakkan ini di sana:

    def skycake():
      print "SkyCake evolves to stay just beyond the cognitive reach of " +
      "the bulk of men. SKYCAKE!!"
  7. Saat kebenaran, Buat file baru /home/el/foo5/main.py, letakkan ini di sana;

    from herp.derp.yolo import skycake
    skycake()
  8. Menjalankannya:

    el@apollo:/home/el/foo5$ python main.py
    SkyCake evolves to stay just beyond the cognitive reach of the bulk 
    of men. SKYCAKE!!

    File kosong __init__.pyberkomunikasi dengan juru bahasa python bahwa pengembang bermaksud direktori ini untuk menjadi paket impor.

Jika Anda ingin melihat posting saya tentang cara memasukkan SEMUA file .py di bawah direktori lihat di sini: https://stackoverflow.com/a/20753073/445131


6
Anda juga harus menambahkan Contoh 6: menggunakan __import__(py_file_name). Panduan luar biasa
oriadam

4
Setiap kali saya memiliki masalah impor saya berakhir pada pertanyaan ini dan saya selalu dapat menyelesaikan masalah saya. Jika saya dapat memperbaiki ini untuk setiap kali Anda membantu saya, saya akan melakukannya.
dgBP

4
Apa perbedaan besar antara semua ini, dan mengapa yang satu lebih baik daripada yang lain? Sebagai contoh 5, Anda menulis "Impor file dalam python dengan perintah impor telanjang," tetapi Anda juga menggunakan perintah impor (telanjang?) Dalam contoh 1, 3 dan 4, bukan?
HelloGoodbye

34
Jawaban yang bagus tetapi fakta bahwa Anda menggunakan file impor yang berbeda sebagai contoh setiap saat membuatnya sulit untuk dibaca.
gented

2
Saya ingin menekankan bahwa meskipun Anda bekerja pada Windows, impornya peka huruf besar-kecil. Jadi Anda tidak dapat memiliki Module.py dan memiliki modul impor
radato

66

Untuk mengimpor file Python tertentu di 'runtime' dengan nama yang dikenal:

import os
import sys

...

scriptpath = "../Test/"

# Add the directory containing your module to the Python path (wants absolute paths)
sys.path.append(os.path.abspath(scriptpath))

# Do the import
import MyModule

Teman saya memeriksa ini hari ini tanpa hasil - sepertinya nama file tidak boleh ada. Dia menggunakan file lokal di direktori induk dan "./" bekerja di akhir seolah-olah direktori induk (..). Memperbaiki masalah dalam posting ditolak - mungkin salah paham (?) Cetak sys.path dan bandingkan catatan jika Anda tidak yakin ...
Tom

29

Anda tidak memiliki banyak metode kompleks untuk mengimpor file python dari satu folder ke folder lain. Cukup buat file __init__.py untuk mendeklarasikan folder ini adalah paket python dan kemudian pergi ke file host Anda di mana Anda ingin mengimpor ketik saja

from root.parent.folder.file import variable, class, whatever


15
Bagaimana jika saya menginginkan jalur relatif?
domih

22

Impor dokumen .. - Tautan untuk referensi

The __init__.pyfile yang diperlukan untuk membuat Python memperlakukan direktori sebagai mengandung paket, hal ini dilakukan untuk mencegah direktori dengan nama umum, seperti string, dari tidak sengaja menyembunyikan modul valid yang terjadi nanti path pencarian modul.

__init__.pybisa berupa file kosong, tetapi juga dapat menjalankan kode inisialisasi untuk paket atau mengatur __all__variabel.

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module

20

Kasus pertama: Anda ingin mengimpor file A.pydalam file B.py, kedua file ini berada di folder yang sama, seperti ini:

. 
├── A.py 
└── B.py

Anda dapat melakukan ini di file B.py:

import A

atau

from A import *

atau

from A import THINGS_YOU_WANT_TO_IMPORT_IN_A

Maka Anda akan dapat menggunakan semua fungsi file A.pydalam fileB.py


Kasus kedua: Anda ingin mengimpor file folder/A.pydalam fileB.py , kedua file ini tidak ada di folder yang sama, seperti ini:

.
├── B.py
└── folder
     └── A.py

Anda dapat melakukannya di file B:

import folder.A

atau

from folder.A import *

atau

from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A

Maka Anda akan dapat menggunakan semua fungsi file A.pydalam fileB.py


Ringkasan: Dalam kasus pertama, file A.pyadalah modul yang Anda impor dalam file B.py, Anda menggunakan sintaks import module_name. Dalam kasus kedua, folderadalah paket yang berisi modulA.py , Anda menggunakan sintaks import package_name.module_name.

Untuk info lebih lanjut tentang paket dan modul, lihat tautan ini .


Saya mencoba dengan sedikit variasi dan berhasil. from folder_a.script import *Script.py ada di bawah folder a.
Justin

+1 Ini yang saya cari. Tidak dapat memahami jawaban lain tetapi Anda menjelaskannya menggunakan direktori.
Black Thunder

Bagaimana jika saya ingin mengimpor file py yang ada di direktori induk?
bytedev

1
@bytedev, tambahkan import sysdan sys.path.append("..")ke awal file. Menurut ini: stackoverflow.com/a/48341902/6057480 . Diuji, berfungsi dengan baik, setelah melakukan ini, Anda akan dapat mengimpor file py di direktori induk dan masih dapat mengimpor file py di direktori dan sub-direktori yang sama.
Bohao LI

17
from file import function_name  ######## Importing specific function
function_name()                 ######## Calling function

dan

import file              ######## Importing whole package
file.function1_name()    ######## Calling function
file.function2_name()    ######## Calling function

Berikut adalah dua cara sederhana yang saya pahami sekarang dan pastikan file "file.py" yang ingin Anda impor sebagai pustaka hadir di direktori Anda saat ini saja.


9

Jika fungsi yang didefinisikan dalam file x.py:

def greet():
    print('Hello! How are you?')

Di file tempat Anda mengimpor fungsi, tulis ini:

from x import greet

Ini berguna jika Anda tidak ingin mengimpor semua fungsi dalam file.


7

cara terbaik untuk mengimpor file .py adalah dengan __init__.py. hal yang paling sederhana untuk dilakukan, adalah membuat file kosong dengan nama __init__.pydirektori yang sama dengan lokasi file.py Anda.

posting ini oleh Mike Grouchy adalah penjelasan yang bagus tentang __init__.pydan penggunaannya untuk membuat, mengimpor, dan mengatur paket python.


1
@GhostCat, saya telah memperbarui respons saya. terima kasih untuk tautannya "lebih disukai".
tertinggi

Dan pahamilah bahwa tidak semua orang tinggal di zona waktu Anda.
GhostCat

4
Anda harus memposting konten posting Mike Grouchy, terutama karena tautannya sekarang 404-an. web.archive.org/web/20190309045451/https://mikegrouchy.com/blog/…
qwr

6

Cara saya mengimpor adalah mengimpor file dan menggunakan singkatan dari namanya.

import DoStuff.py as DS
DS.main()

Jangan lupa bahwa file impor Anda HARUS dinamai dengan ekstensi .py


3
Tidak akan import DoStuff.py as DSmencoba mengimpor pydari DoStuff?
Benj

5

Saya ingin menambahkan catatan ini saya tidak jelas di tempat lain; di dalam modul / paket, ketika memuat dari file, nama modul / paket harus diawali dengan mymodule. Bayangkan mymodulemenjadi tata letak seperti ini:

/main.py
/mymodule
    /__init__.py
    /somefile.py
    /otherstuff.py

Saat memuat somefile.py/ otherstuff.pydari __init__.pykonten akan terlihat seperti:

from mymodule.somefile import somefunc
from mymodule.otherstuff import otherfunc

2

Jika modul yang ingin Anda impor tidak ada dalam sub-direktori , maka coba yang berikut ini dan jalankanapp.py dari direktori induk umum terdalam:

Struktur Direktori:

/path/to/common_dir/module/file.py
/path/to/common_dir/application/app.py
/path/to/common_dir/application/subpath/config.json

Di app.py, tambahkan jalur klien ke sys.path:

import os, sys, inspect

sys.path.append(os.getcwd())
from module.file import MyClass
instance = MyClass()

Opsional (Jika Anda memuat mis. Konfigurasi) (Inspeksi tampaknya yang paling kuat untuk kasus penggunaan saya)

# Get dirname from inspect module
filename = inspect.getframeinfo(inspect.currentframe()).filename
dirname = os.path.dirname(os.path.abspath(filename))
MY_CONFIG = os.path.join(dirname, "subpath/config.json")

Lari

user@host:/path/to/common_dir$ python3 application/app.py

Solusi ini bekerja untuk saya di cli, dan juga PyCharm.


2

Ada beberapa cara untuk memasukkan skrip python Anda dengan nama abc.py

  1. mis. jika file Anda disebut abc.py (import abc) Batasannya adalah file Anda harus ada di lokasi yang sama dengan skrip python panggilan Anda.

impor abc

  1. misal jika file python Anda ada di dalam folder Windows. Folder Windows ada di lokasi yang sama dengan skrip python panggilan Anda.

dari folder import abc

  1. Memetikan skrip abc.py tersedia insider internal_folder yang ada di dalam folder

dari folder.internal_folder impor abc

  1. Seperti dijawab oleh James di atas, kalau-kalau file Anda di beberapa lokasi tetap

import os
import sys
scriptpath = "../Test/MyModule.py"
sys.path.append (os.path.abspath (scriptpath))
impor MyModule

Jika skrip python Anda diperbarui dan Anda tidak ingin mengunggah - gunakan pernyataan ini untuk penyegaran otomatis. Bonus :)

%load_ext autoreload 
%autoreload 2

1

Hanya untuk mengimpor file python di file python lain

katakanlah saya memiliki file python helper.py yang memiliki fungsi tampilan seperti,

def display():
    print("I'm working sundar gsv")

Sekarang di app.py , Anda dapat menggunakan fungsi tampilan,

import helper
helper.display()

Hasil,

I'm working sundar gsv

CATATAN: Tidak perlu menentukan ekstensi .py.


1

Ini mungkin terdengar gila tetapi Anda hanya dapat membuat tautan simbolis ke file yang ingin Anda impor jika Anda hanya membuat skrip wrapper untuk itu.


1

Anda juga dapat melakukan ini: from filename import something

contoh: from client import Client Perhatikan bahwa Anda tidak perlu .py .pyw .pyuiekstensi.


1

Inilah yang saya lakukan untuk memanggil fungsi dari file python, yang fleksibel bagi saya untuk memanggil fungsi apa pun.

import os, importlib, sys

def callfunc(myfile, myfunc, *args):
    pathname, filename = os.path.split(myfile)
    sys.path.append(os.path.abspath(pathname))
    modname = os.path.splitext(filename)[0]
    mymod = importlib.import_module(modname)
    result = getattr(mymod, myfunc)(*args)
    return result

result = callfunc("pathto/myfile.py", "myfunc", arg1, arg2)

Bagaimana cara membuat fungsi baru lebih baik daripada menggunakan fungsi secara langsung?
qwr

@ qwr Fungsi panggilan baru () hanyalah sebuah pembungkus kode untuk memanggil fungsi target dalam file python secara dinamis. Contoh yang diberikan adalah target "myfunc" di file python "pathto / myfile.py". Apa yang Anda maksud dengan "menggunakan fungsi secara langsung"?
Xiao-Feng Li

Bekerja dengan sempurna untuk saya. Dalam contoh saya, saya mengganti: from mypath import Pathdengan Path = callfunc("/folder/to/mypath.py", "Path"). Terima kasih @ Xiao-
FengLi

@ user319436 Senang jawaban saya akhirnya membantu seseorang. :)
Xiao-Feng Li

Terima kasih @ xiao-feng-li !! Jawaban bagus !!
Altieres de Matos

0

Ada banyak cara, seperti yang tercantum di atas, tetapi saya menemukan bahwa saya hanya ingin mengimpor konten file, dan tidak ingin harus menulis baris dan baris dan harus mengimpor modul lain . Jadi, saya datang dengan cara untuk mendapatkan konten file, bahkan dengan sintaks dot ( file.property) yang bertentangan dengan menggabungkan file yang diimpor dengan Anda.
Pertama-tama, ini file saya yang akan saya impor,data.py

    testString= "A string literal to import and test with"


Catatan: Anda bisa menggunakan .txtekstensi sebagai gantinya.
Di mainfile.py, mulailah dengan membuka dan mendapatkan isinya.

    #!usr/bin/env python3
    Data=open('data.txt','r+').read()

Sekarang Anda memiliki konten sebagai string, tetapi mencoba mengakses data.testStringakan menyebabkan kesalahan, seperti datainstance dari strkelas, dan bahkan jika memiliki properti, testStringia tidak akan melakukan apa yang Anda harapkan.
Selanjutnya, buat kelas. Misalnya (pun intended),ImportedFile

    class ImportedFile:

Dan masukkan ini ke dalamnya (dengan indentasi yang sesuai):

    exec(data)


Dan akhirnya, tetapkan kembali dataseperti:

    data=ImportedFile()

Dan itu dia! Cukup akses seperti yang Anda lakukan untuk modul lainnya, mengetik print(data.testString)akan mencetak ke konsol A string literal to import and test with.
Namun, jika Anda ingin yang setara dengan from mod import *hanya drop kelas, tugas contoh, dan hapus exec.

Semoga ini bisa membantu :)
-Benji


Anda benar-benar berpikir membaca isi file sebagai string dan kemudian mengeksekusinya adalah solusi yang baik ketika kita memiliki semua solusi lain yang telah diposkan orang?
qwr

@ qr Err ya, saya lakukan. Banyak jawaban lain tidak berfungsi dalam beberapa situasi. Itulah sebabnya saya membutuhkan cara mudah yang dijamin untuk bekerja. Jika Anda tidak mampu melihat sesuatu dari sudut pandang orang lain, Anda perlu mencoba menggunakan IDLE resmi.
Benj

0

Salah satu fitur Python yang sangat tidak dikenal adalah kemampuan untuk mengimpor zipfile:

library.zip
|-library
|--__init__.py

File __init__.pypaket berisi yang berikut ini:

def dummy():
    print 'Testing things out...'

Kita dapat menulis skrip lain yang dapat mengimpor paket dari arsip zip. Hanya perlu menambahkan file zip ke sys.path.

import sys
sys.path.append(r'library.zip')

import library

def run():
    library.dummy()

run()

apa manfaat yang disediakan oleh file zip?
qwr
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.