Latest web development tutorials

python3 Modul

In den vorangegangenen Abschnitten des Skripts ist Python-Interpreter uns zu programmieren, wenn Sie aus dem Python-Interpreter verlassen und geben Sie dann alle Methoden und Variablen Sie sind verschwunden definieren.

Python bietet eine Möglichkeit, dies zu tun, diese in einer Datei gespeichert Definitionen für einige Skripte oder interaktiven Interpreter-Instanz wird diese Datei als Modul bezeichnet.

Modul ist eine Definition aller Ihrer Dateien, die Funktionen und Variablen enthält, deren Name Suffix .py. Die Module können in andere Programme eingeführt werden, um dieses Modul Funktionen und andere Funktionen zu nutzen. Dies ist auch die Verwendung von Python-Standardbibliothek.

Hier ist ein Beispiel für Python-Standardbibliothek Module verwendet.

#!/usr/bin/python3
# 文件名: using_sys.py

import sys

print('命令行参数如下:')
for i in sys.argv:
   print(i)

print('\n\nPython 路径为:', sys.path, '\n')

Umsetzung der Ergebnisse sind wie folgt:

$ python using_sys.py 参数1 参数2
命令行参数如下:
using_sys.py
参数1
参数2


Python 路径为: ['/root', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages'] 

  • 1, import sys Python-Standardbibliothek sys.py Modul eingeführt, das ist die Einführung eines modularen Ansatzes.
  • 2, sys.argv ist eine Liste der Befehlszeilenoptionen sind enthalten.
  • 3 enthält sys.path ein Python-Interpreter automatisch den Pfad der Liste der Module erforderlich finden.

Import-Anweisung

Wollen Sie Python-Source-Datei zu verwenden, einfach eine andere Import-Anweisung in der Quelldatei ausführen, ist die Syntax wie folgt:

import module1[, module2[,... moduleN]

Wenn der Dolmetscher trifft auf die Import-Anweisung, wenn das Modul im aktuellen Suchpfad nicht importiert werden.

Der Suchpfad ist ein Dolmetscher wird zunächst eine Liste aller Verzeichnisse zu suchen. Wenn Sie den Modulträger importieren möchten, müssen Sie an der Spitze des Skripts zu bestellen:

support.py Datei-Code ist:

#!/usr/bin/python3
# Filename: support.py

def print_func( par ):
    print ("Hello : ", par)
    return

test.py eingeführt Support-Modul:

#!/usr/bin/python3
# Filename: test.py
 
# 导入模块
import support
 
# 现在可以调用模块里包含的函数了
support.print_func("w3big")

Beispiele für die obigen Ausgangs:

$ python3 test.py 
Hello :  w3big

Ein Modul wird nur einmal importiert werden, egal wie viele Male Sie Import auszuführen. Dies verhindert das Importmodul wird ausgeführt, immer und immer wieder.

Wenn wir die Import-Anweisung verwenden, wenn, ist Python-Interpreter wie die entsprechende Datei, um sie zu finden?

Dies beinhaltet die Python-Suchpfad, wird der Suchpfad einer Reihe von Verzeichnisnamen zusammengesetzt, werden Python-Interpreter aus diesen Verzeichnissen drehen für Module eingeführt zu suchen.

Das sieht aus wie eine Umgebungsvariable, in der Tat kann durch die Definition der Suchpfadumgebungsvariable Weise bestimmt werden.

Suchpfad ist der Python-Compiler oder der Installation festgelegt, die Installation neuer Bibliothek sollte auch geändert werden. Der Suchpfad wird in der sys-Modul Pfad-Variable gespeichert, in der interaktiven Interpreter ein einfaches Experiment zu tun, geben Sie den folgenden Code ein:

>>> import sys
>>> sys.path
['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
>>> 

sys.path ist eine Liste der Ausgabe, von denen das erste ein leerer String '', stellt das aktuelle Verzeichnis (wenn aus einem Skript ausgedruckt, Sie offenbar das Verzeichnis zu sehen), dass wir Python-Interpreter ausführen Verzeichnis (wenn das Skript ist das Verzeichnis, in dem das Skript ausgeführt wird).

Also wenn man wie ich im aktuellen Verzeichnis mit dem gleichen Namen wie die Datei existieren, um in das Modul eingeführt werden, wird das Modul zu blockieren, eingeführt werden.

Verstehen Sie das Konzept der Suchpfad können Sie sys.path in einem Skript ändern, einige nicht im Suchpfad des Moduls einzuführen.

Nun wird in dem aktuellen Verzeichnis oder einem Verzeichnis sys.path Interpreter in denen eine fibo.py Datei zu erzeugen, wie folgt:

# 斐波那契(fibonacci)数列模块

def fib(n):    # 定义到 n 的斐波那契数列
    a, b = 0, 1
    while b < n:
        print(b, end=' ')
        a, b = b, a+b
    print()

def fib2(n): # 返回到 n 的斐波那契数列
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result

Dann geben Sie den Python-Interpreter, verwenden Sie den folgenden Befehl, um dieses Modul zu importieren:

>>> import fibo

Dies ist nicht in der FIBO direkt im Namen der Funktion definiert ist, in die aktuelle Symboltabelle geschrieben, aber die Modulnamen fibo dort geschrieben.

Sie können den Namen des Moduls für den Zugriff Funktionen nutzen:

>>> fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'

Wenn Sie beabsichtigen, eine Funktion zu verwenden oft können Sie es zu einem lokalen Namen zuweisen:

>>> fib = fibo.fib
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377


von ... Import-Anweisung

Python ermöglicht es Ihnen, aus dem Modul eine Erklärung von einem bestimmten Teil des aktuellen Namensraum zu importieren, ist die Syntax wie folgt:

from modname import name1[, name2[, ... nameN]]

Um zum Beispiel das Modul FIBO von fib-Funktion zu importieren, verwenden Sie die folgende Erklärung ab:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

Diese Aussage ist nicht die ganze FIBO-Modul in den aktuellen Namensraum, wird es nur Lane fib-Funktion in eingeführt fibo.



Von ... import * Erklärung

Alle Inhalte eines Moduls sind alle in den aktuellen Namensraum möglich sind, einfach die folgende Anweisung:

from modname import *

Dies bietet eine einfache Möglichkeit, ein Modul in allen Projekten zu importieren. Allerdings sollte diese Aussage nicht zu viel zu verwenden.


Tiefe Modul

Zusätzlich zu dem Modul Methodendefinition kann auch einen ausführbaren Code enthalten. Diese Codes werden im Allgemeinen verwendet, um das Modul zu initialisieren. Dieser Code ist nur das erste Mal eingeführt wird, ausgeführt werden.

Jedes Modul hat einen eigenen Symboltabelle, im Inneren des Moduls für alle Funktionen als globale Symboltabelle zu verwenden.

Daher kann der Autor des Moduls sicher, diese globalen Variablen im Modul nutzen, ohne sich um die anderen Benutzer sich Gedanken in einer globalen Variablen Blumen zu engagieren.

Von einem anderen Aspekt, wenn Sie wirklich wissen, was Sie tun, können Sie auch Zugriff auf den Funktionsbaustein durch modname.itemname solche Darstellung.

Die Module können andere Module importieren. In einem Modul (oder ein Skript oder an anderer Stelle) vor allem Verwendung Import um ein Modul zu importieren, natürlich, das ist nur eine Konvention, und nicht zwingend. Der Name des eingeführten Moduls in der Symboltabelle des aktuellen Betrieb des Moduls platziert werden.

Es gibt auch eine Methode der Einfuhren und kann im Modulnamen (in Abhängigkeit von Variablen) direkt verwendet werden, in Ihrem aktuellen Betriebsmodul. Zum Beispiel:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

Diese Methode wird der Modulname nicht importiert wird in der aktuellen Zeichentabelle eingeführt (so nach innen in diesem Fall Name fibo nicht definiert ist).

Dies ist auch eine Möglichkeit, eine einmalige Modul zu setzen alle (Funktion, Variable) Namen in der aktuellen Zeichentabelle Modul importiert werden:

>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

Dies wird importieren alle Namen sind in, aber die eines einzelnen Unterstrich (_) Name ist nicht auf diesen Fall. In den meisten Fällen diese Methode nicht Python-Programmierer verwenden, da Namen aus anderen Quellen eingeführt, die bestehende Definition ist wahrscheinlich zu decken.


__name__ Attribut

Wenn ein Modul zunächst ein anderes Programm eingeführt wird, wird das Hauptprogramm laufen. Wenn wir in das Modul eingeführt werden soll, wird das Modul nicht ein Programmblock ausgeführt haben, können wir __name__ Attribut verwenden, um dieser Block machen ausgeführt wird, selbst nur in der Laufzeitmodul.

#!/usr/bin/python3
# Filename: using_name.py

if __name__ == '__main__':
   print('程序自身在运行')
else:
   print('我来自另一模块')

Führen Sie die folgende Ausgabe:

$ python using_name.py

Programm selbst läuft

$ python
>>> import using_name
我来自另一模块
>>>

Beschreibung: Jedes Modul hat eine __name__ Attribut, wenn sein Wert "__main__ ', zeigt es an, daß das Modul selbst ausgeführt wird , andernfalls wird er eingeführt wird.


dir () Funktion

内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:
</p>
<pre>
>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)  
['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__',
 '__package__', '__stderr__', '__stdin__', '__stdout__',
 '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',
 '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv',
 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',
 'call_tracing', 'callstats', 'copyright', 'displayhook',
 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
 'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
 'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',
 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
 'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',
 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit',
 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout',
 'thread_info', 'version', 'version_info', 'warnoptions']

Wenn kein Argument angegeben wird, dann wird die Funktion dir () die Namen aller aktuell definierten Liste:

>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir() # 得到一个当前模块中定义的属性列表
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
>>> a = 5 # 建立一个新的变量 'a'
>>> dir()
['__builtins__', '__doc__', '__name__', 'a', 'sys']
>>>
>>> del a # 删除变量名a
>>>
>>> dir()
['__builtins__', '__doc__', '__name__', 'sys']
>>>

Standard Module

Python selbst mit einigen der Standard-Bibliothek von Modulen in der Python Library Reference Dokument wird eingeführt werden (dh hinter der "Library Reference Document").

Einige Module werden direkt in den Parser gebaut, diese Sprachen aber nicht einige integrierte Funktionen, aber er war in der Lage ein sehr effizientes zu verwenden, auch ein System-Level-Anrufe sind kein Problem.

Diese Komponenten können in verschiedenen Formen basiert auf unterschiedlichen Betriebssystemen, wie beispielsweise die winreg Modul konfiguriert wird, nur in dem Windows-System verfügbar sein.

Es sollte beachtet werden, dass es ein spezielles Modul sys ist, die in jedem Python Parser erstellt wird. Variablen sys.ps1 und sys.ps2 definiert die primären und sekundären Prompt Prompt entsprechende Zeichenfolge:

>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('Yuck!')
Yuck!
C>

Paket

Paket ist in Form eines Management-Python-Modul-Namensraum, mit "gepunkteten Modulnamen."

Zum Beispiel kann ein Modulname AB ist, dann sagte er, dass ein Paket A-Submodul B.

Wenn das Modul verwenden, müssen Sie sich nicht um globale Variablen zwischen den verschiedenen Modulen Interaktion sorgen, wie die Verwendung von gepunkteten Modulnamen in dieser Form nicht der Fall Modul zwischen verschiedenen Bibliotheken mit dem gleichen Namen zu kümmern.

So, dass verschiedene Autoren können NumPy Modul zur Verfügung stellen, oder Bibliothek Python-Grafiken.

Nehmen wir an, Sie wollen eine einheitliche Sprachverarbeitungsmodul zu entwerfen und eine Datendatei (oder nennen es ein "Paket").

Bestehende Vielzahl von verschiedenen Audio-Formate (im Wesentlichen durch die Erweiterung zu unterscheiden, zum Beispiel: .wav ,: Datei: .aiff ,: Datei: .au), so dass Sie eine Reihe von steigenden Modul haben müssen für zwischen verschiedenen Formaten.

Und für die Audiodaten, gibt es viele verschiedene Operationen (wie Mischen, Hinzufügen von Echo, erhöhen Equalizer-Funktion, um künstliche Stereoeffekt erzeugen), die Sie brauchen auch eine Reihe von, wie nie Module beenden diese Operationen zu behandeln.

Hier ist eine mögliche Paketstruktur (in einer hierarchischen Dateisystem):

sound/                          顶层包
      __init__.py               初始化 sound 包
      formats/                  文件格式转换子包
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  声音效果子包
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  filters 子包
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...

Im Import eines Pakets, wenn Python sys.path Verzeichnisse auf dem Unterverzeichnis auf Basis dieses Paket zu finden, enthält.

Nur Verzeichnis eine Datei enthält den Namen __init__.py wird als Paket betrachtet werden, vor allem einige der gemeinen Missbrauch des Namens zu vermeiden (zum Beispiel genannt string) unvorsichtig den Suchpfad zu einem gültigen Modul beeinflussen.

Im einfachsten Fall, setzen Sie eine leere: file: __ init__.py es. Selbstverständlich kann diese Datei auch einige Initialisierungscode enthalten oder __all__ Variable (wird später beschrieben).

Jedes Mal kann der Benutzer importieren nur ein bestimmtes Modul in der Verpackung, wie zB:

import sound.effects.echo

Dies wird importieren Untermodulen: Sound.Effects.echo. Er muss den vollständigen Namen für den Zugriff verwenden:

sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

Ein anderes Verfahren zum Einführen der Untermodule sind:

from sound.effects import echo

Es wird auch Submodule importieren: echo, und er nicht die langen Präfix müssen, so konnte er nutzen:

echo.echofilter(input, output, delay=0.7, atten=4)

Eine weitere Änderung ist direkt in eine Funktion oder Variable eingeführt:

from sound.effects.echo import echofilter

Auch diese Methode Submodule importieren: echo, und seine echofilter () Funktion verwenden können:

echofilter (Eingang, Ausgang, Verzögerung = 0,7, atten = 4)

Beachten Sie, dass, wenn sie von Paketimport Artikel in dieser Form verwenden, wenn das entsprechende Element sein kann entweder innerhalb des Pakets Untermodul (Sub-Pakete) oder andere Namen in der Paketdefinition, wie Funktion, Klasse oder Variable.

Die Syntax wird zuerst den Namen des Elements als Paket definiert importieren, wenn sie nicht gefunden, dann versucht, ein Modul folgen zu importieren. Wenn nicht gefunden, Glückwünsche, a: exc: Import Ausnahme ausgelöst.

Umgekehrt, wenn Sie dieses Formular benutzen, als Import item.subitem.subsubitem Formular importieren, mit Ausnahme des letzten, es muss ein Paket sein, aber der letzte kann ein Modul oder ein Paket sein, kann aber nicht eine Klasse Name, Funktion oder variabel sein .


Import aus einem Paket *

Stellen Sie sich vor, wenn wir von sound.effects verwenden Import * Was wird passieren?

Python wird das Dateisystem, finden Sie das Paket ein, die alle Untermodule, eins nach dem anderen, alle von ihnen in zu kommen.

Aber leider ist diese Methode auf der Windows-Plattform funktioniert, ist nicht sehr gut, weil Windows ein Groß- und Kleinschreibung System ist.

Auf dieser Plattform kann niemand ECHO.py Datei importiert als Modul Echo oder Echo oder ECHO genannt bürgen.

(Zum Beispiel: Windows 95 ist sehr ärgerlich, den ersten Buchstaben der einzelnen Dateien zu nutzen wird angezeigt) und DOS 8 + 3 Namenskonvention wird sich mit dem Thema lange Modulnamen beschäftigen uns mehr verheddert.

Um dieses Problem zu lösen, das einzige Problem das Paket Autor, um eine genaue Index des Pakets.

Import-Anweisung folgende Regeln: Wenn die Paketdefinitionsdatei namens __init__.py existiert __all__ Liste von Variablen, mit von Paketimport * Zeit, um alle Namen als Paket importieren Inhalt dieser Liste zu setzen.

Als Autor des Pakets, vergessen Sie nicht nach dem Update-Paket auch aktualisiert, um sicherzustellen, ah __all__. Sie sagen, ich werde es nicht tun, ich werde nicht den Import verwenden * diese Nutzung, okay, kein Problem, warum Sie tun, nicht der Chef. Hier ist ein Beispiel, in: file: Töne / Effekte / __ init__.py den folgenden Code enthält:

__all__ = ["echo", "surround", "reverse"]

Dies bedeutet, dass, wenn Sie diese Nutzung von sound.effects verwenden * importieren, können Sie das Paket innerhalb der drei Sub-Module zu importieren.

Wenn __all__ wirklich nicht definiert ist, dann verwenden Sie diese Syntax von sound.effects * Zeit importieren, ist es keine Untermodule im Paket sound.effects importieren. Er legte nur den gesamten Inhalt des Pakets und seine sound.effects innen definiert, in zu kommen (definiert sind, können __init__.py Initialisierungscode ausgeführt werden).

Dies wird __init__.py welche alle Namen definiert in zu kommen. Und er wird alle explizit angegebene Modul wurde nicht zerstören, bevor wir diesen Satz eingeführt. Sehen Sie sich diesen Teil des Codes:

import sound.effects.echo
import sound.effects.surround
from sound.effects import *

In diesem Beispiel vor der Ausführung von ... Import, Paket Sound.Effects das Echo und Surround-Module werden in den aktuellen Namensraum importiert. (Natürlich, auch wenn Sie definieren __all__ kein Problem)

Normalerweise treten wir nicht die Verwendung von * dieser Methode das Modul zu importieren, da häufig diese Methode reduziert Lesbarkeit führen wird. Aber das ist wirklich ein Tastendruck viel Mühe sparen können, und einige Module sind so konzipiert, die nur Import durch eine bestimmte Methode zu werden.

Denken Sie daran, mit Hilfe von Package Import specific_submodule diese Methode wird nie falsch sein. In der Tat ist dies die empfohlene Methode. Es sei denn, Sie wollen Sub-Module und Teilmodule zu importieren andere Pakete mit dem gleichen Namen haben können.

Wenn die Struktur des Pakets ist ein Unterpaket (wie das Beispiel für das Paket ist Ton), und möchten Ihnen die Brüder-Paket (das gleiche Level-Paket) zu importieren, müssen Sie importierte absoluten Pfad verwenden zu importieren. Zum Beispiel, wenn Sie das Modul sound.filters.vocoder Paket sound.effects Module echo verwenden möchten, müssen Sie schreiben von sound.effects Echo importieren.

from . import echo
from .. import formats
from ..filters import equalizer

Ob implizit oder explizit relativen Importe stammen aus dem Anfang des aktuellen Moduls. Name des Hauptmoduls ist immer "__main__", ein Hauptmodul des Python-Anwendung, sollten Sie immer einen absoluten Pfad Referenzen verwenden.

Paket bietet auch eine zusätzliche Eigenschaft __path__. Dies ist eine Liste von Verzeichnissen, von denen jede ein Verzeichnis, das Paket für diesen Dienst __init__.py enthält, hat, Sie haben vor anderen in __init__.py definiert ausgeführt werden oh. Diese Variable kann in dem Paket und das Kind Paket enthalten im Inneren des Moduls für Einfluss modifiziert werden.

Diese Funktion wird nicht häufig verwendet, in der Regel verwendet, um das Paket innerhalb des Moduls zu verlängern.