Jak zaimportować inne pliki Python?

798

Jak zaimportować inne pliki do Pythona?

  1. Jak dokładnie mogę zaimportować określony plik Pythona import file.py?
  2. Jak mogę zaimportować folder zamiast określonego pliku?
  3. Chcę dynamicznie ładować plik Pythona w czasie wykonywania na podstawie danych wprowadzonych przez użytkownika.
  4. Chcę wiedzieć, jak załadować tylko jedną określoną część z pliku.

Na przykład w main.pyMam:

from extra import * 

Chociaż daje mi to wszystkie definicje extra.py, kiedy być może wszystko, czego chcę, to jedna definicja:

def gap():
    print
    print

Co mogę dodać do importrachunku po prostu dostać gapod extra.py?

Pogromca
źródło
Zobacz także: stackoverflow.com/questions/8663076/…
dreftymac

Odpowiedzi:

443

importlibzostał dodany do Pythona 3, aby programowo zaimportować moduł. To tylko opakowanie __import__, zobacz dokumenty .

import importlib

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

Uwaga: .pyrozszerzenie należy usunąć z moduleName. Funkcja definiuje również packageargument dotyczący importu względnego.


Aktualizacja: poniższa odpowiedź jest nieaktualna . Skorzystaj z najnowszej alternatywy powyżej.

  1. Tylko import filebez rozszerzenia „.py”.

  2. Możesz oznaczyć folder jako pakiet, dodając pusty plik o nazwie __init__.py.

  3. Możesz użyć tej __import__funkcji. Pobiera nazwę modułu jako ciąg. (Ponownie: nazwa modułu bez rozszerzenia „.py”.)

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

    Wpisz help(__import__)więcej szczegółów.

Radian
źródło
7
Jeśli dodasz plik an import filenamedo pliku init .py, możesz zaimportować moduł bezpośrednio jako nazwę folderu.
CornSmith
9
od 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
Co jeśli nie jest to pakiet, ale tylko plik skryptu?
Jonathan
3
W przypadku importowania pliku skryptu w tej samej ścieżce (być może działałoby to również w przypadku pliku skryptu w ścieżce wyszukiwania w języku Python), import filenamenoextdziała dobrze dla mnie w Pythonie 3.4.8.
Alex Hall,
7
Czy nadal jest dokładny w 2019 roku? Czy to python3 czy 2?
Sandburg
1030

Istnieje wiele sposobów importowania pliku python, wszystkie z ich zaletami i wadami.

Nie tylko pośpiesznie wybieraj pierwszą strategię importu, która Ci odpowiada, bo w przeciwnym razie będziesz musiał przepisać bazę kodu, gdy okaże się, że nie spełnia ona Twoich potrzeb.

Zacznę od wyjaśnienia najprostszego przykładu # 1, a następnie przejdę do najbardziej profesjonalnego i solidnego przykładu # 7

Przykład 1, Zaimportuj moduł python z interpreterem python:

  1. Umieść to w /home/el/foo/fox.py:

    def what_does_the_fox_say():
      print("vixens cry")
  2. Wejdź do interpretera 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
    >>> 

    Zaimportowałeś lisa za pomocą interpretera python, what_does_the_fox_say()wywołałeś funkcję python z fox.py.

Przykład 2: Użyj execfilelub ( execw Python 3 ) w skrypcie, aby uruchomić inny plik Pythona w miejscu:

  1. Umieść to w /home/el/foo2/mylib.py:

    def moobar():
      print("hi")
  2. Umieść to w /home/el/foo2/main.py:

    execfile("/home/el/foo2/mylib.py")
    moobar()
  3. uruchom plik:

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

    Funkcja moobar została zaimportowana z mylib.py i udostępniona w main.py

Przykład 3, Użyj z ... importuj ... funkcjonalność:

  1. Umieść to w /home/el/foo3/chekov.py:

    def question():
      print "where are the nuclear wessels?"
  2. Umieść to w /home/el/foo3/main.py:

    from chekov import question
    question()
  3. Uruchom tak:

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

    Jeśli zdefiniujesz inne funkcje w chekov.py, nie będą one dostępne, chyba że Ty import *

Przykład 4: Zaimportuj plik riaa.py, jeśli znajduje się w innym miejscu pliku niż miejsce, w którym jest importowany

  1. Umieść to w /home/el/foo4/stuff/riaa.py:

    def watchout():
      print "computers are transforming into a noose and a yoke for humans"
  2. Umieść to w /home/el/foo4/main.py:

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

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

    To importuje wszystko z obcego pliku z innego katalogu.

Przykład 5, użyj os.system("python yourfile.py")

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

Przykład 6: zaimportuj plik za pomocą haka uruchamiania Pythona:

Aktualizacja: Ten przykład działał zarówno dla Python2, jak i 3, ale teraz działa tylko dla Python2. Python3 pozbył się tego zestawu funkcji uruchamiania użytkownika, ponieważ był nadużywany przez słabo wykwalifikowanych twórców bibliotek Pythona, wykorzystując go do nielegalnego wstrzykiwania kodu do globalnej przestrzeni nazw, przed wszystkimi programami zdefiniowanymi przez użytkownika. Jeśli chcesz, żeby to działało w Pythonie 3, będziesz musiał być bardziej kreatywny. Jeśli powiem ci, jak to zrobić, programiści Pythona również wyłączą ten zestaw funkcji, więc jesteś sam.

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

Umieść ten kod w swoim katalogu domowym w ~/.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 )

Umieść ten kod w pliku main.py (może być w dowolnym miejscu):

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!")

Uruchom to, powinieneś dostać to:

$ 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!

Jeśli pojawi się tutaj błąd: ModuleNotFoundError: No module named 'user'oznacza to, że używasz Python3, haki startowe są tam domyślnie wyłączone.

Kredyt za ten jist idzie do: https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py Wyślij wzdłuż swoich łodzi.

Przykład 7, najbardziej niezawodny: importuj pliki w pythonie za pomocą zwykłego polecenia importu:

  1. Utwórz nowy katalog /home/el/foo5/
  2. Utwórz nowy katalog /home/el/foo5/herp
  3. Utwórz pusty plik o nazwie __init__.pyherp:

    el@apollo:/home/el/foo5/herp$ touch __init__.py
    el@apollo:/home/el/foo5/herp$ ls
    __init__.py
  4. Utwórz nowy katalog / home / el / foo5 / herp / derp

  5. W ramach derp utwórz kolejny __init__.pyplik:

    el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
    el@apollo:/home/el/foo5/herp/derp$ ls
    __init__.py
  6. Pod / home / el / foo5 / herp / derp utwórz nowy plik o nazwie yolo.pyUmieść to tutaj:

    def skycake():
      print "SkyCake evolves to stay just beyond the cognitive reach of " +
      "the bulk of men. SKYCAKE!!"
  7. Chwila prawdy: Zrób nowy plik /home/el/foo5/main.py, umieść go tam;

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

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

    Pusty __init__.pyplik informuje interpreter języka Python, że programista zamierza, aby ten katalog był pakietem do importowania.

Jeśli chcesz zobaczyć mój post na temat dołączania WSZYSTKICH plików .py do katalogu, zobacz tutaj: https://stackoverflow.com/a/20753073/445131

Eric Leschinski
źródło
6
Powinieneś także dodać przykład 6: używając __import__(py_file_name). W każdym razie niesamowity przewodnik
oriadam
4
Za każdym razem, gdy mam problem z importem, kończę na tym pytaniu i zawsze jestem w stanie rozwiązać mój problem. Gdybym mógł głosować za każdym razem, gdy mi pomogłeś, zrobiłbym to.
dgBP
4
Jaka jest duża różnica między nimi wszystkimi i dlaczego jedna jest lepsza od innych? Na przykład 5 piszesz „Importuj pliki w pythonie za pomocą zwykłego polecenia importu”, ale używasz również polecenia (goły?) W przykładach 1, 3 i 4, prawda?
HelloGoodbye,
34
Dobra odpowiedź, ale fakt, że cały czas używasz innego pliku importu, sprawia, że ​​czytanie jest trudne.
gented
2
Chciałbym podkreślić, że nawet jeśli pracujesz w systemie Windows, w importu rozróżniana jest wielkość liter. Więc nie możesz mieć Module.py i mieć w swoim module importu
radato
66

Aby zaimportować określony plik Pythona w „środowisku wykonawczym” o znanej nazwie:

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
James
źródło
Mój przyjaciel sprawdził to dzisiaj bez powodzenia - wygląda na to, że nazwa pliku nie powinna tam być. Użył pliku lokalnego w katalogu nadrzędnym, a „./” działał na końcu tak, jakby katalog nadrzędny (..). Naprawienie problemu w poście zostało odrzucone - prawdopodobnie nieporozumienie (?) Wydrukuj sys.path i porównaj rekordy, jeśli nie jesteś pewien ...
Tom
29

Nie ma wielu skomplikowanych metod importowania pliku Pythona z jednego folderu do drugiego. Po prostu utwórz plik __init__.py , aby zadeklarować, że ten folder jest pakietem Pythona, a następnie przejdź do pliku hosta, do którego chcesz zaimportować, po prostu wpisz

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

Fatih Karatana
źródło
14
Co jeśli chcę ścieżki względnej?
domih
21

Importuj dokument .. - Link w celach informacyjnych

__init__.pyPliki są wymagane, aby Python traktował katalogi jako zawierające pakiety. Ma to na celu zapobieganie przypadkowemu ukrywaniu prawidłowych modułów pojawiających się później w ścieżce wyszukiwania katalogów o wspólnej nazwie, takich jak łańcuch.

__init__.pymoże być tylko pustym plikiem, ale może również wykonać kod inicjujący pakiet lub ustawić __all__zmienną.

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
Sanyal
źródło
19

Pierwszy przypadek: chcesz zaimportować plik A.pyw pliku B.py, te dwa pliki znajdują się w tym samym folderze, jak poniżej:

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

Możesz to zrobić w pliku B.py:

import A

lub

from A import *

lub

from A import THINGS_YOU_WANT_TO_IMPORT_IN_A

Następnie będziesz mógł korzystać ze wszystkich funkcji pliku A.pyw plikuB.py


Drugi przypadek: chcesz zaimportować plik folder/A.pyw pliku B.py, te dwa pliki nie znajdują się w tym samym folderze, tak jak to:

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

Możesz to zrobić w pliku B:

import folder.A

lub

from folder.A import *

lub

from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A

Następnie będziesz mógł korzystać ze wszystkich funkcji pliku A.pyw plikuB.py


Podsumowanie: W pierwszym przypadku plik A.pyjest modułem, który importujesz do pliku B.py, użyłeś składni import module_name. W drugim przypadku folderjest to pakiet, który zawiera moduł A.py, użyłeś składni import package_name.module_name.

Aby uzyskać więcej informacji o pakietach i modułach, zapoznaj się z tym linkiem .

Bohao LI
źródło
Próbowałem z małą odmianą i zadziałało. from folder_a.script import *Script.py znajduje się w folderze a.
Justin
+1 Właśnie tego szukałem. Nie mogłem zrozumieć innych odpowiedzi, ale wyjaśniłeś to za pomocą katalogów.
Black Thunder,
Co jeśli chcę zaimportować plik py znajdujący się w katalogu nadrzędnym?
bytedev
1
@bytedev Dodaj import sysi sys.path.append("..")na początku pliku. Zgodnie z tym: stackoverflow.com/a/48341902/6057480 . Przetestowane, działające idealnie, po wykonaniu tej czynności będziesz mógł zaimportować plik py w katalogu nadrzędnym i nadal będzie mógł importować pliki py w tym samym katalogu i podkatalogach.
Bohao LI,
17
from file import function_name  ######## Importing specific function
function_name()                 ######## Calling function

i

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

Oto dwa proste sposoby, które do tej pory zrozumiałem, i upewnij się, że plik „file.py”, który chcesz zaimportować jako bibliotekę, znajduje się tylko w bieżącym katalogu.

Devendra Bhat
źródło
9

Jeśli zdefiniowana funkcja znajduje się w pliku x.py:

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

W pliku, w którym importujesz funkcję, napisz:

from x import greet

Jest to przydatne, jeśli nie chcesz importować wszystkich funkcji z pliku.

Sid
źródło
7

najlepszym sposobem na import plików .py jest __init__.py. najprostszą rzeczą do zrobienia jest utworzenie pustego pliku o nazwie __init__.pyw tym samym katalogu, w którym znajduje się plik.py.

ten post Mike Grouchy jest doskonałym wyjaśnieniem __init__.pyi jego wykorzystaniem do tworzenia, importowania i konfigurowania pakietów python.

najwyższy
źródło
1
@GhostCat Zaktualizowałem swoją odpowiedź. dzięki za link „byłoby lepiej”.
najwyższy
I zrozum, że nie wszyscy żyją w twojej strefie czasowej.
GhostCat
4
Powinieneś był opublikować treść postu Mike'a Grouchy'ego, zwłaszcza, że ​​link ma teraz 404s. web.archive.org/web/20190309045451/https://mikegrouchy.com/blog/…
qwr
6

Sposób importowania polega na zaimportowaniu pliku i skróceniu jego nazwy.

import DoStuff.py as DS
DS.main()

Nie zapominaj, że importowany plik MUSI BYĆ nazwany z rozszerzeniem .py

Łukasza 359
źródło
3
Czy nie import DoStuff.py as DSpróbowałbyś importować pyz DoStuff?
Benj
5

Chciałbym dodać tę notatkę, której nie bardzo wyraźnie gdzie indziej; wewnątrz modułu / pakietu podczas ładowania z plików nazwa modułu / pakietu musi być poprzedzona znakiem mymodule. Wyobraź sobie mymoduletaki układ:

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

Podczas ładowania somefile.py/ otherstuff.pyz __init__.pyzawartości powinno wyglądać:

from mymodule.somefile import somefunc
from mymodule.otherstuff import otherfunc
Svend
źródło
2

Jeśli modułu, który chcesz zaimportować, nie ma w podkatalogu , spróbuj wykonać następujące czynności i uruchomapp.py z najgłębszego wspólnego katalogu nadrzędnego:

Struktura katalogów:

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

W app.pydołącz ścieżkę klienta do sys.path:

import os, sys, inspect

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

Opcjonalne (jeśli ładujesz np. Konfiguracje) (Inspekcja wydaje się najbardziej niezawodna dla moich przypadków użycia)

# 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")

Biegać

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

To rozwiązanie działa dla mnie zarówno w CLI, jak i PyCharm.

Christoph Schranz
źródło
2

Istnieje kilka sposobów dołączania skryptu python o nazwie abc.py

  1. np. jeśli plik nazywa się abc.py (import abc) Ograniczeniem jest to, że plik powinien znajdować się w tej samej lokalizacji, w której znajduje się wywołujący skrypt Pythona.

import abc

  1. np. jeśli plik python znajduje się w folderze Windows. Folder Windows znajduje się w tym samym miejscu, w którym znajduje się wywołujący skrypt Pythona.

z folderu importuj abc

  1. Skrypt Incase abc.py jest dostępny od wewnątrz folder wewnętrzny

z folderu.in.in_folder import abc

  1. Jak odpowiedział James powyżej, na wypadek, gdyby plik znajdował się w określonej lokalizacji

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

Jeśli twój skrypt Pythona zostanie zaktualizowany i nie chcesz przesyłać - użyj tych instrukcji do automatycznego odświeżania. Bonus :)

%load_ext autoreload 
%autoreload 2
rishi jain
źródło
1

Wystarczy zaimportować plik python do innego pliku python

powiedzmy, że mam plik python helper.py , który ma funkcję wyświetlania, np.

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

Teraz w app.py możesz użyć funkcji wyświetlania,

import helper
helper.display()

Wyjście,

I'm working sundar gsv

UWAGA: Nie trzeba określać rozszerzenia .py.

Sundar Gsv
źródło
1

Może to zabrzmi szalenie, ale możesz po prostu utworzyć symboliczny link do pliku, który chcesz zaimportować, jeśli tworzysz do niego skrypt otoki.

Jonathan
źródło
1

Możesz także to zrobić: from filename import something

przykład: from client import Client pamiętaj, że nie potrzebujesz .py .pyw .pyuirozszerzenia.

Lucas Soares
źródło
1

W ten sposób wywołałem funkcję z pliku Pythona, która jest dla mnie elastyczna do wywoływania dowolnych funkcji.

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)
Xiao-Feng Li
źródło
W jaki sposób ulepszenie nowej funkcji jest lepsze niż bezpośrednie korzystanie z funkcji?
qwr
@qwr Nowa funkcja callfunc () to po prostu opakowanie kodu do dynamicznego wywoływania funkcji docelowej w pliku python. Podany przykład to docelowy „myfunc” w pliku python „pathto / myfile.py”. Co rozumiesz przez „bezpośrednie korzystanie z funkcji”?
Xiao-Feng Li
Działa idealnie dla mnie. W moim przykładzie otrzymuje: from mypath import Pathz Path = callfunc("/folder/to/mypath.py", "Path"). Dzięki @ Xiao-FengLi
user319436
@ user319436 Cieszę się, że moja odpowiedź w końcu pomaga komuś. :)
Xiao-Feng Li
Dziękujemy @ xiao-feng-li !! Świetna odpowiedź!!
Altieres de Matos
0

Istnieje wiele sposobów wymienionych powyżej, ale uważam, że chcę po prostu zaimportować zawartość pliku i nie chcę pisać wierszy i wierszy oraz importować innych modułów. Tak więc wymyśliłem sposób na uzyskanie zawartości pliku, nawet ze składnią kropkową ( file.property) zamiast scalania importowanego pliku z twoim.
Po pierwsze, oto mój plik, który zaimportuję,data.py

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


Uwaga: Zamiast tego możesz użyć .txtrozszerzenia.
W mainfile.pyrozpocznij od otwarcia i pobrania zawartości.

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

Teraz masz zawartość jako ciąg, ale próba dostępu data.testStringspowoduje błąd, podobnie jak datainstancja strklasy, i nawet jeśli ma właściwość testString, nie zrobi tego, czego się spodziewałeś.
Następnie utwórz klasę. Na przykład (gra słów zamierzona)ImportedFile

    class ImportedFile:

I włóż to w to (z odpowiednim wcięciem):

    exec(data)


I na koniec przypisz datatak:

    data=ImportedFile()

I to wszystko! Po prostu uzyskaj dostęp, tak jak w przypadku dowolnego innego modułu, pisanie print(data.testString)zostanie wydrukowane na konsoli A string literal to import and test with.
Jeśli jednak chcesz, aby ekwiwalent po from mod import *prostu porzucił klasę, przypisanie instancji i usunął dent exec.

Mam nadzieję, że to pomaga :)
-Benji

Benj
źródło
Naprawdę myślisz, że czytanie zawartości pliku jako łańcucha, a następnie wykonanie go jest dobrym rozwiązaniem, gdy mamy wszystkie inne rozwiązania, które ludzie opublikowali?
qwr
@qwr Erm tak, robię. Wiele innych odpowiedzi nie działa w niektórych sytuacjach. Dlatego potrzebowałem łatwego sposobu, który gwarantowałby mi pracę. Jeśli nie możesz zobaczyć rzeczy z innego punktu widzenia, musisz spróbować użyć oficjalnego IDLE.
Benj
0

Jedną z bardzo nieznanych funkcji Pythona jest możliwość importowania zipplików:

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

Plik __init__.pypakietu zawiera następujące elementy:

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

Możemy napisać kolejny skrypt, który może zaimportować pakiet z archiwum zip. Konieczne jest jedynie dodanie pliku zip do sys.path.

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

import library

def run():
    library.dummy()

run()
Przeklęty
źródło
jakie korzyści zapewnia plik zip?
qwr