Hoe andere Python-bestanden importeren?

Hoe importeer ik andere bestanden in Python?

  1. Hoe kan ik precies een specifiek python-bestand zoals import file.pyimporteren?
  2. Hoe kan ik een map importeren in plaats van een specifiek bestand?
  3. Ik wil een Python-bestand dynamisch laden tijdens runtime, gebaseerd op gebruiker
    invoer.
  4. Ik wil weten hoe ik slechts één specifiek deel uit het bestand kan laden.

Bijvoorbeeld, in main.pyheb ik:

from extra import * 

Hoewel dit me alle definities in extra.pygeeft, terwijl ik misschien alleen maar een enkele definitie wil:

def gap():
    print
    print

Wat voeg ik toe aan de import-instructie om gewoon gapte krijgen van extra.py?


Antwoord 1, autoriteit 100%

importlibis 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 packagevoor relatieve importen.

In python 2.x:

  • Gewoon import filezonder de .py-extensie
  • Een map kan als pakket worden gemarkeerd door een leeg bestand __init__.pytoe 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:

  1. Zet dit in /home/el/foo/fox.py:

    def what_does_the_fox_say():
      print("vixens cry")
    
  2. Kom in de python-interpreter:

    [email protected]:/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 execfileof (execin Python 3) in een script om het andere python-bestand op zijn plaats uit te voeren:

  1. Zet dit in /home/el/foo2/mylib.py:

    def moobar():
      print("hi")
    
  2. Zet dit in /home/el/foo2/main.py:

    execfile("/home/el/foo2/mylib.py")
    moobar()
    
  3. voer het bestand uit:

    [email protected]:/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:

  1. Zet dit in /home/el/foo3/chekov.py:

    def question():
      print "where are the nuclear wessels?"
    
  2. Zet dit in /home/el/foo3/main.py:

    from chekov import question
    question()
    
  3. Voer het als volgt uit:

    [email protected]:/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

  1. Zet dit in /home/el/foo4/stuff/riaa.py:

    def watchout():
      print "computers are transforming into a noose and a yoke for humans"
    
  2. 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()
    
  3. Voer het uit:

    [email protected]:/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:

  1. Maak een nieuwe map /home/el/foo5/
  2. Maak een nieuwe map /home/el/foo5/herp
  3. Maak een leeg bestand met de naam __init__.pyonder herp:

    [email protected]:/home/el/foo5/herp$ touch __init__.py
    [email protected]:/home/el/foo5/herp$ ls
    __init__.py
    
  4. Maak een nieuwe map /home/el/foo5/herp/derp

  5. Maak onder derp nog een __init__.py-bestand:

    [email protected]:/home/el/foo5/herp/derp$ touch __init__.py
    [email protected]:/home/el/foo5/herp/derp$ ls
    __init__.py
    
  6. Maak onder /home/el/foo5/herp/derp een nieuw bestand met de naam yolo.pyZet dit daarin:

    def skycake():
      print "SkyCake evolves to stay just beyond the cognitive reach of " +
      "the bulk of men. SKYCAKE!!"
    
  7. Het moment van de waarheid, maak het nieuwe bestand /home/el/foo5/main.py, plaats dit daarin;

    from herp.derp.yolo import skycake
    skycake()
    
  8. Voer het uit:

    [email protected]:/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__.pygeeft 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.pyimporteren 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.pyin bestand B.py

gebruiken


Tweede geval

U wilt bestand folder/A.pyimporteren 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.pyin bestand B.py

gebruiken


Samenvatting

  • In het eerste gevalis bestand A.pyeen module die u importeert in bestand B.py, u gebruikte de syntaxis import module_name.
  • In het tweede gevalis folderhet pakket dat de module A.pybevat, je hebt de syntaxis import 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__.pybestanden 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__.pykan 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.pybevindt:

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__.pyin dezelfde map die u.py-bestand bevindt.

DIT Post door Mike Gouchy is een grote uitleg van __init__.pyEN 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 mymoduleLayout als volgt:

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

Bij het laden van somefile.py/ otherstuff.pyvan __init__.pyDe 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

  1. 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

  1. 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

  1. Incase ABC.PY-script is beschikbaar Insider Internal_Folder die aanwezig is in map

Vanaf map.Internal_folder Import ABC

  1. 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 .pyuiextensie nodig hebt.


14

Indien de -module die u wilt importeren niet in een submap , probeer dan het volgende en voert u app.pyuit 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.pyhet 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

[email protected]:/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__.pyvan 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.utilom direct een .py-bestand op een willekeurige locatie als module te importeren zonder dat u sys.pathhoeft 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_nameParameter MOET een tekenreeks of een padachtig object zijn. De module_nameParameter is vereist, omdat alle geladen Python-modules een (gestippelde) module-naam (zoals sys, importlibof 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.pyimportababbaar 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.

Other episodes