Hoe importeer ik andere bestanden in Python?
- Hoe kan ik precies een specifiek python-bestand zoals
import file.py
importeren? - Hoe kan ik een map importeren in plaats van een specifiek bestand?
- Ik wil een Python-bestand dynamisch laden tijdens runtime, gebaseerd op gebruiker
invoer. - Ik wil weten hoe ik slechts één specifiek deel uit het bestand kan laden.
Bijvoorbeeld, in main.py
heb ik:
from extra import *
Hoewel dit me alle definities in extra.py
geeft, terwijl ik misschien alleen maar een enkele definitie wil:
def gap():
print
print
Wat voeg ik toe aan de import
-instructie om gewoon gap
te krijgen van extra.py
?
Antwoord 1, autoriteit 100%
importlib
is toegevoegd naar Python 3 om een module programmatisch te importeren.
import importlib
moduleName = input('Enter module name:')
importlib.import_module(moduleName)
De .py-extensie moet worden verwijderd uit moduleName
. De functie definieert ook een argument package
voor relatieve importen.
In python 2.x:
- Gewoon
import file
zonder de .py-extensie - Een map kan als pakket worden gemarkeerd door een leeg bestand
__init__.py
toe te voegen - U kunt de functie
__import__
gebruiken, die de modulenaam (zonder extensie) als stringextensie neemt
pmName = input('Enter module name:')
pm = __import__(pmName)
print(dir(pm))
Typ help(__import__)
voor meer details.
Antwoord 2, autoriteit 95%
Er zijn veel manieren om een python-bestand te importeren, allemaal met hun voor- en nadelen.
Kies niet overhaast de eerste importstrategie die voor u werkt, anders moet u de codebase later herschrijven als u merkt dat deze niet aan uw behoeften voldoet.
Ik zal beginnen met het uitleggen van het eenvoudigste voorbeeld #1, daarna ga ik naar het meest professionele en robuuste voorbeeld #7
Voorbeeld 1, importeer een python-module met python-interpreter:
-
Zet dit in /home/el/foo/fox.py:
def what_does_the_fox_say(): print("vixens cry")
-
Kom in de python-interpreter:
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 >>>
Je hebt fox geïmporteerd via de python-interpreter, de python-functie
what_does_the_fox_say()
aangeroepen vanuit fox.py.
Voorbeeld 2, gebruik execfile
of (exec
in Python 3) in een script om het andere python-bestand op zijn plaats uit te voeren:
-
Zet dit in /home/el/foo2/mylib.py:
def moobar(): print("hi")
-
Zet dit in /home/el/foo2/main.py:
execfile("/home/el/foo2/mylib.py") moobar()
-
voer het bestand uit:
el@apollo:/home/el/foo$ python main.py hi
De functie moobar is geïmporteerd uit mylib.py en beschikbaar gemaakt in main.py
Voorbeeld 3, gebruik van … import … functionaliteit:
-
Zet dit in /home/el/foo3/chekov.py:
def question(): print "where are the nuclear wessels?"
-
Zet dit in /home/el/foo3/main.py:
from chekov import question question()
-
Voer het als volgt uit:
el@apollo:/home/el/foo3$ python main.py where are the nuclear wessels?
Als u andere functies in chekov.py had gedefinieerd, zouden ze niet beschikbaar zijn tenzij u
import *
Voorbeeld 4, riaa.py importeren als het zich op een andere bestandslocatie bevindt dan waar het is geïmporteerd
-
Zet dit in /home/el/foo4/stuff/riaa.py:
def watchout(): print "computers are transforming into a noose and a yoke for humans"
-
Zet dit in /home/el/foo4/main.py:
import sys import os sys.path.append(os.path.abspath("/home/el/foo4/stuff")) from riaa import * watchout()
-
Voer het uit:
el@apollo:/home/el/foo4$ python main.py computers are transforming into a noose and a yoke for humans
Dat importeert alles in het buitenlandse bestand uit een andere map.
Voorbeeld 5, gebruik os.system("python yourfile.py")
import os
os.system("python yourfile.py")
Voorbeeld 6, importeer uw bestand via meeliften op de python startuphook:
Update:dit voorbeeld werkte vroeger voor zowel python2 als 3, maar werkt nu alleen voor python2. python3 heeft deze opstarthook-functies voor gebruikers verwijderd omdat deze werd misbruikt door laaggeschoolde python-bibliotheekschrijvers, die deze gebruikten om hun code onbeleefd in de globale naamruimte te injecteren, vóór alle door de gebruiker gedefinieerde programma’s. Als je wilt dat dit werkt voor python3, moet je creatiever worden. Als ik je vertel hoe je het moet doen, zullen Python-ontwikkelaars die functieset ook uitschakelen, dus je staat er alleen voor.
Zie: https://docs.python.org/2/library/user. html
Zet deze code in uw homedirectory in ~/.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 )
Zet deze code in uw main.py (kan overal zijn):
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!")
Voer het uit, je zou dit moeten krijgen:
$ 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!
Als je hier een foutmelding krijgt: ModuleNotFoundError: No module named 'user'
dan betekent dit dat je python3 gebruikt, startuphooks zijn daar standaard uitgeschakeld.
Tegoed voor deze jist gaat naar: https: //github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.pyStuur je up-boats mee.
Voorbeeld 7, Meest robuust: importeer bestanden in python met het bare import-commando:
- Maak een nieuwe map
/home/el/foo5/
- Maak een nieuwe map
/home/el/foo5/herp
-
Maak een leeg bestand met de naam
__init__.py
onder herp:el@apollo:/home/el/foo5/herp$ touch __init__.py el@apollo:/home/el/foo5/herp$ ls __init__.py
-
Maak een nieuwe map /home/el/foo5/herp/derp
-
Maak onder derp nog een
__init__.py
-bestand:el@apollo:/home/el/foo5/herp/derp$ touch __init__.py el@apollo:/home/el/foo5/herp/derp$ ls __init__.py
-
Maak onder /home/el/foo5/herp/derp een nieuw bestand met de naam
yolo.py
Zet dit daarin:def skycake(): print "SkyCake evolves to stay just beyond the cognitive reach of " + "the bulk of men. SKYCAKE!!"
-
Het moment van de waarheid, maak het nieuwe bestand
/home/el/foo5/main.py
, plaats dit daarin;from herp.derp.yolo import skycake skycake()
-
Voer het uit:
el@apollo:/home/el/foo5$ python main.py SkyCake evolves to stay just beyond the cognitive reach of the bulk of men. SKYCAKE!!
Het lege bestand
__init__.py
geeft aan de python-interpreter door dat de ontwikkelaar van plan is dat deze map een importeerbaar pakket is.
Als je mijn bericht wilt zien over het opnemen van ALLE .py-bestanden in een map, kijk dan hier: https://stackoverflow. com/a/20753073/445131
Antwoord 3, autoriteit 17%
Om een specifiek Python-bestand bij ‘runtime’ met een bekende naam te importeren:
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
Antwoord 4, autoriteit 12%
Eerste geval
U wilt bestand A.py
importeren in bestand B.py
, deze twee bestanden staan in dezelfde map, als volgt:
.
├── A.py
└── B.py
U kunt dit doen in bestand B.py
:
import A
of
from A import *
of
from A import THINGS_YOU_WANT_TO_IMPORT_IN_A
Dan kunt u alle functies van bestand A.py
in bestand B.py
gebruiken
Tweede geval
U wilt bestand folder/A.py
importeren in bestand B.py
, deze twee bestanden staan niet in dezelfde map, zoals dit:
.
├── B.py
└── folder
└── A.py
U kunt dit doen in bestand B.py
:
import folder.A
of
from folder.A import *
of
from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A
Dan kunt u alle functies van bestand A.py
in bestand B.py
gebruiken
Samenvatting
- In het eerste gevalis bestand
A.py
een module die u importeert in bestandB.py
, u gebruikte de syntaxisimport module_name
. - In het tweede gevalis
folder
het pakket dat de moduleA.py
bevat, je hebt de syntaxisimport package_name.module_name
.
Voor meer informatie over pakketten en modules, raadpleeg deze link.
Antwoord 5, autoriteit 7%
Je hebt niet veel complexe methoden om een python-bestand van de ene map naar de andere te importeren. Maak gewoon een __init__.py-bestand om aan te geven dat deze map een python-pakket is en ga dan naar je hostbestand waar je wilt importeren, typ gewoon
from root.parent.folder.file import variable, class, whatever
Antwoord 6, autoriteit 5%
Document importeren ..— Link voor referentie
De __init__.py
bestanden zijn nodig om Python de mappen te laten behandelen als pakketten, dit wordt gedaan om te voorkomen dat mappen met een algemene naam, zoals string, onbedoeld geldige modules verbergen die later voorkomen op het zoekpad van de module.
__init__.py
kan gewoon een leeg bestand zijn, maar het kan ook initialisatiecode voor het pakket uitvoeren of de variabele __all__
instellen.
mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
Antwoord 7, autoriteit 3%
from file import function_name ######## Importing specific function
function_name() ######## Calling function
en
import file ######## Importing whole package
file.function1_name() ######## Calling function
file.function2_name() ######## Calling function
Hier zijn de twee eenvoudige manieren die ik inmiddels heb begrepen en zorg ervoor dat het bestand “file.py” dat u als bibliotheek wilt importeren, alleen in uw huidige map aanwezig is.
Antwoord 8, autoriteit 3%
Als de gedefinieerde functie zich in een bestand x.py
bevindt:
def greet():
print('Hello! How are you?')
In het bestand waarin u de functie importeert, schrijf dit:
from x import greet
Dit is handig als u niet alle functies in een bestand wilt importeren.
9
De beste manier om te importeren. Py-bestanden is via __init__.py
. Het eenvoudigste om te doen, is om een leeg bestand te maken met de naam __init__.py
in dezelfde map die u.py-bestand bevindt.
DIT Post door Mike Gouchy is een grote uitleg van __init__.py
EN HET GEBRUIK VAN PYTHON PAKKETTAGEN MAKEN, importeren, importeren en instellen.
10
Ik wil deze opmerking toevoegen dat ik niet heel duidelijk elders is; In een module / pakket, bij het laden van bestanden, moet de module / pakketnaam vooraf worden ingegorneerd met de mymodule
. Stel je voor mymodule
Layout als volgt:
/main.py
/mymodule
/__init__.py
/somefile.py
/otherstuff.py
Bij het laden van somefile.py
/ otherstuff.py
van __init__.py
De inhoud zou eruit moeten zien:
from mymodule.somefile import somefunc
from mymodule.otherstuff import otherfunc
11
Hoe i Import is het bestand importeren en de name van zijn naam gebruiken.
import DoStuff.py as DS
DS.main()
Vergeet niet dat uw importbestand is genoemd met .py extensie
12
Er zijn een paar manieren van het opnemen van uw Python-script met naam ABC.PY
- b.g. Als uw bestand ABC.PY (Import ABC) wordt genoemd
Beperking is dat uw bestand op dezelfde locatie aanwezig moet zijn waar uw calling Python-script is.
ABC importeren
- b.g. Als uw Python-bestand zich in de Windows-map bevindt. Windows-map is aanwezig op dezelfde locatie waar uw calling Python-script is.
Van map importeren ABC
- Incase ABC.PY-script is beschikbaar Insider Internal_Folder die aanwezig is in map
Vanaf map.Internal_folder Import ABC
- Zoals beantwoord door James hierboven, in het geval dat uw bestand op een bepaalde locatie is
Import OS
import sys
scriptpad = “../test/mymodule.py”
Sys.path.Append (OS.Path.abspath (scriptpad))
import mymodule
Als uw Python-script wordt bijgewerkt en u niet wilt uploaden – gebruik deze verklaringen voor Auto Refresh. Bonus 🙂
%load_ext autoreload
%autoreload 2
13
U kunt dit ook doen: from filename import something
Voorbeeld: from client import Client
Merk op dat u niet de .py .pyw .pyui
extensie nodig hebt.
14
Indien de -module die u wilt importeren niet in een submap , probeer dan het volgende en voert u app.py
uit De diepste gemeenschappelijke oudermap:
Directorystructuur:
/path/to/common_dir/module/file.py
/path/to/common_dir/application/app.py
/path/to/common_dir/application/subpath/config.json
Voeg in app.py
het pad van de client toe aan sys.path:
import os, sys, inspect
sys.path.append(os.getcwd())
from module.file import MyClass
instance = MyClass()
Optioneel (als je bijv. configs laadt) (Inspect lijkt de meest robuuste te zijn voor mijn gebruiksscenario’s)
# 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")
Rennen
user@host:/path/to/common_dir$ python3 application/app.py
Deze oplossing werkt voor mij zowel in cli als in PyCharm.
Antwoord 15
Dit is hoe ik deed om een functie aan te roepen vanuit een python-bestand, dat is flexibel voor mij om alle functies aan te roepen.
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)
Antwoord 16
Alleen om een python-bestand in een ander python-bestand te importeren
laten we zeggen dat ik een helper.pypython-bestand heb met een weergavefunctie zoals,
def display():
print("I'm working sundar gsv")
Nu kun je in app.pyde weergavefunctie gebruiken,
import helper
helper.display()
De uitvoer,
I'm working sundar gsv
OPMERKING:U hoeft de .py-extensie niet op te geven.
Antwoord 17
Dit klinkt misschien gek, maar je kunt gewoon een symbolische link maken naar het bestand dat je wilt importeren als je er alleen een wrapper-script voor maakt.
Antwoord 18
Een zeer onbekende functie van Python is de mogelijkheid om zip
-bestanden te importeren:
library.zip
|-library
|--__init__.py
Het bestand __init__.py
van het pakket bevat het volgende:
def dummy():
print 'Testing things out...'
We kunnen een ander script schrijven dat een pakket uit het zip-archief kan importeren. Het is alleen nodig om het zip-bestand toe te voegen aan het sys.path.
import sys
sys.path.append(r'library.zip')
import library
def run():
library.dummy()
run()
Antwoord 19
Als u Python 3.5 of hoger gebruikt, kunt u importlib.util
om direct een .py
-bestand op een willekeurige locatie als module te importeren zonder dat u sys.path
hoeft aan te passen.
import importlib.util
import sys
def load_module(file_name, module_name)
spec = importlib.util.spec_from_file_location(module_name, file_name)
module = importlib.util.module_from_spec(spec)
sys.modules[module_name] = module
spec.loader.exec_module(module)
return module
De file_name
Parameter MOET een tekenreeks of een padachtig object zijn. De module_name
Parameter is vereist, omdat alle geladen Python-modules een (gestippelde) module-naam (zoals sys
, importlib
of importlib.util
), maar u kunt een beschikbare naam kiezen voor deze nieuwe module.
U kunt deze functie als volgt gebruiken:
my_module = load_module("file.py", "mymod")
Nadat het eenmaal in het Python-proces is geïmporteerd met behulp van de load_module()
-functie, wordt de module geïmporteerd met behulp van de module-naam die eraan wordt gegeven.
# file.py =
print(f"{__name__} imported (file.py)")
# =========
# one.py ==
print(f"{__name__} imported (one.py)")
load_module("file.py", "mymod")
import two
# =========
# two.py ==
print(f"{__name__} imported (two.py)")
import mymod
# =========
Gezien de bovenstaande bestanden, kunt u de volgende opdracht uitvoeren om te zien hoe file.py
importababbaar is geworden.
$ python3 -m one
__main__ imported (one.py)
two imported (two.py)
mymod imported (file.py)
Dit antwoord is gebaseerd op de officiële Python-documentatie: importlib
: een bronbestand rechtstreeks importeren.
20
import sys
#print(sys.path)
sys.path.append('../input/tokenization')
import tokenization
Om elk. Py-bestand te importeren, kunt u hierboven-code gebruiken.
Voeg eerst het pad toe en importeer vervolgens
Opmerking: ‘../ Input / tokenization’ map bevat tokenization.py-bestand
21
from y import *
- Zeg dat u een bestand x en y hebt.
- U wilt Y-bestand importeren naar x.
Ga vervolgens naar uw X-bestand en plaats de bovenstaande opdracht. Om dit te testen, plaatst u gewoon een afdrukfunctie in uw Y-bestand en wanneer uw import succesvol was dan in X-bestand, zou het moeten afdrukken.