Wie importiere ich andere Python-Dateien?


798

Wie importiere ich andere Dateien in Python?

  1. Wie genau kann ich eine bestimmte Python-Datei wie importieren import file.py?
  2. Wie kann ich einen Ordner anstelle einer bestimmten Datei importieren?
  3. Ich möchte eine Python-Datei zur Laufzeit dynamisch laden, basierend auf Benutzereingaben.
  4. Ich möchte wissen, wie nur ein bestimmtes Teil aus der Datei geladen wird.

Zum Beispiel in main.pyIch habe:

from extra import * 

Obwohl dies mir alle Definitionen gibt extra.py, wenn ich vielleicht nur eine einzige Definition möchte:

def gap():
    print
    print

Was ich dem hinzufügen , importum nur zu bekommen Aussage gapaus extra.py?


Antworten:


443

importlibwurde zu Python 3 hinzugefügt, um ein Modul programmgesteuert zu importieren. Es ist nur ein Wrapper __import__, siehe die Dokumente .

import importlib

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

Hinweis: Die .pyErweiterung sollte aus entfernt werden moduleName. Die Funktion definiert auch ein packageArgument für relative Importe.


Update: Die Antwort unten ist veraltet . Verwenden Sie die neuere Alternative oben.

  1. Nur import fileohne die Erweiterung '.py'.

  2. Sie können einen Ordner als Paket markieren, indem Sie eine leere Datei mit dem Namen hinzufügen __init__.py.

  3. Sie können die __import__Funktion verwenden. Der Modulname wird als Zeichenfolge verwendet. (Nochmals: Modulname ohne die Erweiterung '.py'.)

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

    Geben Sie help(__import__)für weitere Details ein.


7
Wenn Sie import filenameder init .py eine hinzufügen , können Sie das Modul direkt als Ordnernamen importieren.
CornSmith

9
von 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
Was ist, wenn es sich nicht um ein Paket handelt, sondern nur um eine Skriptdatei?
Jonathan

3
Das Importieren einer Skriptdatei im selben Pfad (möglicherweise funktioniert es auch für eine Skriptdatei in einem Python-Suchpfad) import filenamenoextfunktioniert mit Python 3.4.8 für mich einwandfrei.
Alex Hall

7
Ist es 2019 noch korrekt? Ist es Python3 oder 2?
Sandburg

1031

Es gibt viele Möglichkeiten, eine Python-Datei zu importieren, alle mit ihren Vor- und Nachteilen.

Wählen Sie nicht einfach hastig die erste Importstrategie aus, die für Sie funktioniert, sonst müssen Sie die Codebasis später neu schreiben, wenn Sie feststellen, dass sie nicht Ihren Anforderungen entspricht.

Ich werde zunächst das einfachste Beispiel Nr. 1 erläutern und mich dann dem professionellsten und robustesten Beispiel Nr. 7 zuwenden

Beispiel 1: Importieren Sie ein Python-Modul mit einem Python-Interpreter:

  1. Fügen Sie dies in /home/el/foo/fox.py ein:

    def what_does_the_fox_say():
      print("vixens cry")
  2. Steigen Sie in den Python-Interpreter ein:

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

    Sie haben fox über den Python-Interpreter importiert und die Python-Funktion what_does_the_fox_say()aus fox.py heraus aufgerufen.

Beispiel 2: Verwenden Sie execfileoder ( execin Python 3 ) in einem Skript, um die andere vorhandene Python-Datei auszuführen:

  1. Fügen Sie dies in /home/el/foo2/mylib.py ein:

    def moobar():
      print("hi")
  2. Fügen Sie dies in /home/el/foo2/main.py ein:

    execfile("/home/el/foo2/mylib.py")
    moobar()
  3. Führen Sie die Datei aus:

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

    Die Funktion moobar wurde aus mylib.py importiert und in main.py zur Verfügung gestellt

Beispiel 3, Verwendung von ... Import ... -Funktionalität:

  1. Fügen Sie dies in /home/el/foo3/chekov.py ein:

    def question():
      print "where are the nuclear wessels?"
  2. Fügen Sie dies in /home/el/foo3/main.py ein:

    from chekov import question
    question()
  3. Führen Sie es so aus:

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

    Wenn Sie andere Funktionen in chekov.py definiert hätten, wären sie nur verfügbar, wenn Sie import *

Beispiel 4: Importieren Sie riaa.py, wenn es sich an einem anderen Dateispeicherort befindet als der Ort, an dem es importiert wird

  1. Fügen Sie dies in /home/el/foo4/stuff/riaa.py ein:

    def watchout():
      print "computers are transforming into a noose and a yoke for humans"
  2. Fügen Sie dies in /home/el/foo4/main.py ein:

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

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

    Das importiert alles in der fremden Datei aus einem anderen Verzeichnis.

Beispiel 5 verwenden os.system("python yourfile.py")

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

Beispiel 6: Importieren Sie Ihre Datei, indem Sie den Python-Starthook huckepack nehmen:

Update: Dieses Beispiel funktionierte früher sowohl für Python2 als auch für Python 3, jetzt jedoch nur noch für Python2. python3 hat diesen Benutzer-Startuphook-Funktionsumfang entfernt, weil er von Python-Bibliotheksschreibern mit geringen Fähigkeiten missbraucht wurde, um ihren Code vor allen benutzerdefinierten Programmen unhöflich in den globalen Namespace einzufügen. Wenn dies für Python3 funktionieren soll, müssen Sie kreativer werden. Wenn ich Ihnen sage, wie es geht, deaktivieren Python-Entwickler diesen Funktionsumfang ebenfalls, sodass Sie alleine sind.

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

Fügen Sie diesen Code in Ihr Home-Verzeichnis ein ~/.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 )

Fügen Sie diesen Code in Ihre main.py ein (kann überall sein):

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

Führen Sie es aus, Sie sollten dies bekommen:

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

Wenn hier eine Fehlermeldung ModuleNotFoundError: No module named 'user'angezeigt wird, bedeutet dies, dass Sie Python3 verwenden. Dort sind Starthooks standardmäßig deaktiviert.

Die Gutschrift für diesen Jist geht an: https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py Senden Sie Ihre U -Boote mit.

Beispiel 7, Robusteste: Importieren Sie Dateien in Python mit dem Befehl bare import:

  1. Erstellen Sie ein neues Verzeichnis /home/el/foo5/
  2. Erstellen Sie ein neues Verzeichnis /home/el/foo5/herp
  3. __init__.pyErstellen Sie eine leere Datei mit dem Namen unter herp:

    el@apollo:/home/el/foo5/herp$ touch __init__.py
    el@apollo:/home/el/foo5/herp$ ls
    __init__.py
  4. Erstellen Sie ein neues Verzeichnis / home / el / foo5 / herp / derp

  5. Erstellen Sie unter derp eine weitere __init__.pyDatei:

    el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
    el@apollo:/home/el/foo5/herp/derp$ ls
    __init__.py
  6. Erstellen Sie unter / home / el / foo5 / herp / derp eine neue Datei mit dem Namen yolo.pyPut this in there:

    def skycake():
      print "SkyCake evolves to stay just beyond the cognitive reach of " +
      "the bulk of men. SKYCAKE!!"
  7. Der Moment der Wahrheit, Machen Sie die neue Datei /home/el/foo5/main.py, legen Sie diese dort ein;

    from herp.derp.yolo import skycake
    skycake()
  8. Starte es:

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

    Die leere __init__.pyDatei teilt dem Python-Interpreter mit, dass der Entwickler beabsichtigt, dass dieses Verzeichnis ein importierbares Paket ist.

Wenn Sie meinen Beitrag zum Einfügen ALLER .py-Dateien in ein Verzeichnis sehen möchten, lesen Sie hier: https://stackoverflow.com/a/20753073/445131


6
Sie sollten auch Beispiel 6 hinzufügen: using __import__(py_file_name).
Trotzdem eine

4
Jedes Mal, wenn ich ein Importproblem habe, komme ich zu dieser Frage und kann mein Problem immer lösen. Wenn ich dies für jedes Mal, wenn Sie mir geholfen haben, positiv bewerten könnte, würde ich es tun.
dgBP

4
Was ist der große Unterschied zwischen all diesen und warum ist einer besser als jeder andere? In Beispiel 5 schreiben Sie "Dateien in Python mit dem Befehl bare import importieren", aber Sie verwenden auch den Befehl (bare?) Import in den Beispielen 1, 3 und 4, nicht wahr?
HelloGoodbye

34
Gute Antwort, aber die Tatsache, dass Sie immer eine andere Importdatei als Beispiel verwenden, macht das Lesen umständlich.
Gented

2
Ich möchte betonen, dass der Import auch unter Windows zwischen Groß- und Kleinschreibung unterscheidet. Sie können also nicht Module.py haben und haben in Ihrem Code- Import-Modul
radato

66

So importieren Sie eine bestimmte Python-Datei zur Laufzeit mit einem bekannten Namen:

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

Mein Freund hat dies heute ohne Glück überprüft - es sieht so aus, als ob der Dateiname nicht da sein sollte. Er verwendete eine lokale Datei im übergeordneten Verzeichnis und "./" arbeitete am Ende so, als ob das übergeordnete Verzeichnis (..). Das Problem in der Post zu beheben wurde abgelehnt - wahrscheinlich Missverständnis (?) Drucken Sie sys.path und vergleichen Sie Datensätze, wenn Sie nicht sicher sind ...
Tom

29

Sie haben nicht viele komplexe Methoden, um eine Python-Datei von einem Ordner in einen anderen zu importieren. Erstellen Sie einfach eine __init__.py- Datei, um zu deklarieren, dass dieser Ordner ein Python-Paket ist, und wechseln Sie dann zu Ihrer Host-Datei, in die Sie importieren möchten. Geben Sie einfach Folgendes ein

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


15
Was ist, wenn ich einen relativen Pfad möchte?
Domih

21

Dokument importieren .. - Link als Referenz

Das __init__.py Dateien sind erforderlich, damit Python die Verzeichnisse als Pakete enthaltend behandelt. Dies verhindert, dass Verzeichnisse mit einem allgemeinen Namen, z. B. eine Zeichenfolge, unbeabsichtigt gültige Module verbergen, die später im Modul-Suchpfad auftreten.

__init__.pykann nur eine leere Datei sein, aber es kann auch Initialisierungscode für das Paket ausführen oder die __all__Variable setzen.

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

19

Erster Fall: Sie möchten eine Datei A.pyin eine Datei importieren B.py. Diese beiden Dateien befinden sich wie folgt im selben Ordner:

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

Sie können dies in der Datei tun B.py:

import A

oder

from A import *

oder

from A import THINGS_YOU_WANT_TO_IMPORT_IN_A

Dann können Sie alle Funktionen von Datei A.pyin Datei verwendenB.py


Zweiter Fall: Sie möchten eine Datei folder/A.pyin eine Datei importieren B.py. Diese beiden Dateien befinden sich nicht im selben Ordner wie folgt:

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

Sie können dies in Datei B tun:

import folder.A

oder

from folder.A import *

oder

from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A

Dann können Sie alle Funktionen von Datei A.pyin Datei verwendenB.py


Zusammenfassung: Im ersten Fall ist Datei A.pyein Modul, das Sie in eine Datei importieren B.py. Sie haben die Syntax verwendet import module_name. Im zweiten Fall, folderdem Paket, das das Modul enthält A.py, haben Sie die Syntax verwendet import package_name.module_name.

Weitere Informationen zu Paketen und Modulen finden Sie unter diesem Link .


Ich habe es mit einer kleinen Variation versucht und es hat funktioniert. from folder_a.script import *Script.py befindet sich unter dem Ordner a.
Justin

+1 Das habe ich gesucht. Konnte andere Antworten nicht verstehen, aber Sie haben es anhand der Verzeichnisse erklärt.
Black Thunder

Was ist, wenn ich eine py-Datei importieren möchte, die sich im übergeordneten Verzeichnis befindet?
Bytedev

1
@bytedev Hinzufügen import sysund sys.path.append("..")am Anfang der Datei. Demnach: stackoverflow.com/a/48341902/6057480 . Getestet und einwandfrei funktioniert, können Sie danach eine py-Datei in das übergeordnete Verzeichnis importieren und weiterhin py-Dateien in dasselbe Verzeichnis und dieselben Unterverzeichnisse importieren.
Bohao LI

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

und

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

Hier sind die zwei einfachen Möglichkeiten, die ich inzwischen verstanden habe, und stellen Sie sicher, dass Ihre "file.py" -Datei, die Sie als Bibliothek importieren möchten, nur in Ihrem aktuellen Verzeichnis vorhanden ist.


9

Wenn sich die definierte Funktion in einer Datei befindet x.py:

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

Schreiben Sie in die Datei, in die Sie die Funktion importieren, Folgendes:

from x import greet

Dies ist nützlich, wenn Sie nicht alle Funktionen in eine Datei importieren möchten.


7

Der beste Weg, um .py-Dateien zu importieren, ist über __init__.py. __init__.pyAm einfachsten ist es, eine leere Datei mit demselben Namen zu erstellen, in der sich Ihre.py-Datei befindet.

Dieser Beitrag von Mike Grouchy ist eine großartige Erklärung __init__.pyund Verwendung zum Erstellen, Importieren und Einrichten von Python-Paketen.


1
@ GhostCat Ich habe meine Antwort aktualisiert. danke für den link "es wäre vorzuziehen".
Oberster

Und verstehe, dass nicht jeder in deiner Zeitzone lebt.
GhostCat

4
Du hättest den Inhalt von Mike Grouchys Post posten sollen, besonders seit dem Link jetzt 404s. web.archive.org/web/20190309045451/https://mikegrouchy.com/blog/…
qwr

6

Beim Importieren wird die Datei importiert und die Kurzform des Namens verwendet.

import DoStuff.py as DS
DS.main()

Vergessen Sie nicht, dass Ihre Importdatei mit der Erweiterung .py benannt sein muss


3
Wäre es nicht import DoStuff.py as DSversuchen, Import pyaus DoStuff?
Benj

5

Ich möchte diesen Hinweis hinzufügen, den ich an anderer Stelle nicht sehr deutlich mache. Innerhalb eines Moduls / Pakets muss beim Laden aus Dateien dem Modul- / Paketnamen das Präfix vorangestellt werden mymodule. Stellen Sie sich mymoduleein Layout wie folgt vor:

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

Beim Laden somefile.py/ otherstuff.pyvon __init__.pydem Inhalt soll wie folgt aussehen:

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

2

Falls das Modul Sie importieren wollen , ist nicht in einem Unterverzeichnis , dann versuchen Sie die folgende und laufenapp.py von der tiefsten gemeinsamen Stammverzeichnis:

Verzeichnisaufbau:

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

In app.py, append Pfad des Client sys.path:

import os, sys, inspect

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

Optional (Wenn Sie z. B. Konfigurationen laden) (Inspect scheint für meine Anwendungsfälle die robusteste zu sein.)

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

Lauf

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

Diese Lösung funktioniert sowohl für CLI als auch für PyCharm.


2

Es gibt verschiedene Möglichkeiten, Ihr Python-Skript mit dem Namen abc.py einzuschließen

  1. Beispiel: Wenn Ihre Datei abc.py heißt (abc importieren). Die Einschränkung besteht darin, dass sich Ihre Datei an derselben Stelle befindet, an der sich Ihr aufrufendes Python-Skript befindet.

import abc

  1. Beispiel: Wenn sich Ihre Python-Datei im Windows-Ordner befindet. Der Windows-Ordner befindet sich an derselben Stelle, an der sich Ihr aufrufendes Python-Skript befindet.

aus Ordner importieren abc

  1. Das Incase abc.py-Skript ist im Insider-Ordner "internal_folder" verfügbar, der sich im Ordner befindet

aus folder.internal_folder import abc

  1. Wie von James oben beantwortet, falls sich Ihre Datei an einem festen Ort befindet

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

Falls Ihr Python-Skript aktualisiert wird und Sie es nicht hochladen möchten, verwenden Sie diese Anweisungen für die automatische Aktualisierung. Bonus :)

%load_ext autoreload 
%autoreload 2

1

Nur um eine Python-Datei in eine andere Python-Datei zu importieren

Nehmen wir an, ich habe eine Python-Datei helper.py , die eine Anzeigefunktion hat wie:

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

Jetzt in app.py können Sie die Anzeigefunktion verwenden,

import helper
helper.display()

Die Ausgabe,

I'm working sundar gsv

HINWEIS: Die Erweiterung .py muss nicht angegeben werden.


1

Das mag verrückt klingen, aber Sie können einfach einen symbolischen Link zu der Datei erstellen, die Sie importieren möchten, wenn Sie nur ein Wrapper-Skript dafür erstellen.


1

Sie können dies auch tun: from filename import something

Beispiel: from client import Client Beachten Sie, dass Sie die .py .pyw .pyuiErweiterung nicht benötigen .


1

So habe ich eine Funktion aus einer Python-Datei aufgerufen, die für mich flexibel ist, um alle Funktionen aufzurufen.

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)

Wie kann man eine neue Funktion verbessern, als sie direkt zu verwenden?
qwr

@qwr Die neue Funktion callfunc () ist einfach ein Wrapper des Codes, um die Zielfunktion in der Python-Datei dynamisch aufzurufen. Das angegebene Beispiel ist das Ziel "myfunc" in der Python-Datei "pathto / myfile.py". Was meinst du mit "Funktion direkt nutzen"?
Xiao-Feng Li

Hat perfekt für mich funktioniert. In meinem Beispiel habe ich ersetzt: from mypath import Pathdurch Path = callfunc("/folder/to/mypath.py", "Path"). Danke @ Xiao-FengLi
user319436

@ user319436 Ich bin froh, dass meine Antwort endlich jemandem hilft. :)
Xiao-Feng Li

Danke @ xiao-feng-li !! Gute Antwort!!
Altieres de Matos

0

Es gibt viele Möglichkeiten, wie oben aufgeführt, aber ich finde, dass ich nur den Inhalt einer Datei importieren möchte und nicht Zeilen und Zeilen schreiben und andere importieren muss Module . Also habe ich mir eine Möglichkeit ausgedacht, den Inhalt einer Datei auch mit der Punktsyntax ( file.property) abzurufen, anstatt die importierte Datei mit Ihrer zusammenzuführen.
Hier ist zunächst meine Datei, die ich importieren werde.data.py

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


Hinweis: Sie können .txtstattdessen die Erweiterung verwenden.
In mainfile.py, startet durch Öffnen und den Inhalt zu bekommen.

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

Jetzt haben Sie den Inhalt als Zeichenfolge, aber der Versuch, darauf zuzugreifen, data.testStringführt zu einem Fehler wiedata wie eine Instanz der strKlasse, und selbst wenn sie eine Eigenschaft testStringhat, wird sie nicht das tun, was Sie erwartet haben.
Erstellen Sie als Nächstes eine Klasse. Zum Beispiel (Wortspiel beabsichtigt),ImportedFile

    class ImportedFile:

Und setzen Sie dies ein (mit der entsprechenden Einrückung):

    exec(data)


Und zum Schluss datawie folgt neu zuweisen :

    data=ImportedFile()

Und das ist es! Wenn Sie wie bei jedem anderen Modul darauf zugreifen, wird die Eingabe print(data.testString)auf der Konsole gedrucktA string literal to import and test with .
Wenn Sie jedoch das Äquivalent möchten, löschen Sie from mod import *einfach die Klasse, die Instanzzuweisung und deaktivieren Sie die exec.

Hoffe das hilft :)
-Benji


Sie denken ernsthaft, dass es eine gute Lösung ist, den Inhalt der Datei als Zeichenfolge zu lesen und dann auszuführen, wenn wir alle anderen Lösungen haben, die von Menschen veröffentlicht wurden?
qwr

@qwr Ähm ja, das tue ich. Viele der anderen Antworten funktionieren in bestimmten Situationen nicht. Deshalb brauchte ich einen einfachen Weg, der garantiert funktioniert. Wenn Sie nicht in der Lage sind, Dinge aus einem anderen Blickwinkel zu sehen, müssen Sie versuchen, den offiziellen IDLE zu verwenden.
Benj

0

Eine sehr unbekannte Funktion von Python ist die Möglichkeit, zipDateien zu importieren :

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

Die Datei __init__.pydes Pakets enthält Folgendes:

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

Wir können ein anderes Skript schreiben, das ein Paket aus dem Zip-Archiv importieren kann. Es ist nur erforderlich, die Zip-Datei zum sys.path hinzuzufügen.

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

import library

def run():
    library.dummy()

run()

Welchen Nutzen bietet die Zip-Datei?
qwr
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.