Latest web development tutorials

модуль python3

В предыдущих разделах сценария является интерпретатор Python для программирования с нами, если вы выходите и ввести из интерпретатора Python, то все методы и переменные, которые определяют исчезнут.

Python предоставляет способ сделать это, эти определения хранятся в файле для некоторых сценариев или интерактивного экземпляра интерпретатора, этот файл называется модулем.

Модуль является определение всех ваших файлов, который содержит функции и переменные, имена которых суффикс .py. Модули могут быть введены в другие программы, чтобы использовать этот модуль функции и другие функции. Это также использование питона стандартной библиотеки.

Ниже приведен пример стандартных модулей Python библиотеки используется.

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

import sys

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

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

Реализация результатов заключаются в следующем:

$ 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, импорт SYS введены питона стандартной библиотеки модуль sys.py, это введение модульного подхода.
  • 2, sys.argv список ключей командной строки включены.
  • 3, sys.path включает интерпретатор Python автоматически найдет путь списка необходимых модулей.

Оператор импорта

Хотите использовать исходный файл Python, просто выполнить другой оператор импорта в исходном файле, синтаксис выглядит следующим образом:

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

Когда интерпретатор встречает оператор импорта, если модуль будет импортирован в текущем пути поиска.

Путь поиска является переводчиком сначала будет искать список всех каталогов. Как вы хотите импортировать модуль поддержки, вам необходимо заказать в верхней части сценария:

support.py код файла:

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

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

test.py представила модуль поддержки:

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

Примеры вышеуказанного вывода:

$ python3 test.py 
Hello :  w3big

Модуль будет импортировать только один раз, независимо от того, сколько раз вы выполняете импорт. Это предотвращает модуль импорта выполняется снова и снова.

Когда мы используем оператор импорта, когда интерпретатор Python как найти соответствующий файл это?

Это включает в себя путь поиска Python, путь поиска состоит из ряда имен каталогов, интерпретатор Python превратится из этих каталогов для поиска модулей введенных.

Это выглядит как переменную окружения, на самом деле, может быть определено путем определения пути поиска переменной среды способом.

Поиск путь компилятор Python или установка определяется, установить новую библиотеку также должен быть изменен. Путь поиска хранится в переменной пути.Модуль SYS, сделать простой эксперимент, в ходе интерактивного интерпретатора, введите следующий код:

>>> 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 список продукции, первый из которых является пустая строка '', представляет текущий каталог (если печатается из сценария, вы можете более четко увидеть, какие директории), что мы выполняем интерпретатор питона каталог (если скрипт каталог, в котором запускается сценарий).

Так что если, как я, существуют в текущем каталоге с тем же именем, что и файл должен быть введен в модуль, модуль будет введен, чтобы блокировать.

Понять концепцию пути поиска, вы можете изменить sys.path в сценарии, чтобы ввести некоторые из них не в пути поиска модуля.

Теперь, в текущем каталоге или каталоге sys.path интерпретатора, в котором для создания файла fibo.py, следующим образом:

# 斐波那契(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

Затем введите интерпретатор Python, используйте следующую команду, чтобы импортировать этот модуль:

>>> import fibo

Это не определено в Fibo непосредственно во имя функции записывается в текущую таблицу символов, но имя модуля фибо там написано.

Вы можете использовать имя модуля для доступа к функциям:

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

Если вы собираетесь использовать функцию часто вы можете назначить его локальному имени:

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


от ... оператора импорта

Python позволяет импортировать заявления от определенной части текущего пространства имен из модуля, синтаксис выглядит следующим образом:

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

Например, чтобы импортировать модуль фибо функции Фибо, используйте следующее заявление:

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

Это утверждение не весь модуль фибо в текущем пространстве имен, то это будет только фибо функция FIB Lane введена в.



От ... импорт * заявление

Все содержимое модуля все в текущем пространстве имен можно просто использовать следующее заявление:

from modname import *

Это обеспечивает легкий способ импортировать модуль во всех проектах. Однако это утверждение не должно быть слишком много, чтобы использовать.


модуль Глубина

В дополнение к модулю определения метода также может включать в себя исполняемый код. Эти коды обычно используются для инициализации модуля. Этот код вводится только первый раз, когда будет выполняться.

Каждый модуль имеет свою собственную независимую таблицу символов, внутри модуля использовать для всех функций в качестве глобальной таблицы символов.

Таким образом, автор модуля может безопасно использовать эти глобальные переменные в модуле, не заботясь о других пользователей, чтобы участвовать в глобальной переменной цветы.

В другом аспекте, когда вы действительно знаете, что вы делаете, вы можете также получить доступ к функциональным модулем с помощью modname.itemname такого представления.

Модули могут импортировать другие модули. В модуле (или сценарии, или в другом месте) всего использовать импорт, чтобы импортировать модуль, конечно, это просто соглашение, а не обязательный характер. Имя импортируемого модуля будут помещены в таблицу символов текущей работы модуля.

Существует также способ импорта, импорт может быть использован непосредственно в имени модуля (функция переменных) в текущий операционный модуль. Например:

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

Этот метод не будет импортировать имя модуля вводится в текущей таблице символов (так что в этом случае внутри, фибо имя не определено).

Это также способ поставить одноразовый модуль на все (функция, переменная) имена импортируются в текущий модуль таблицы символов:

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

Это будет импортировать все имена находятся в, но те из одного подчеркивания (_) имя не по этому делу. В большинстве случаев Python программисты не используют этот метод, так как имена, введенные из других источников, скорее всего, для покрытия существующего определения.


__name__ атрибут

Когда модуль впервые ввел другую программу, основная программа будет работать. Если мы хотим быть введены в модуле, модуль не выполняет программный блок, мы можем использовать атрибут __name__, чтобы сделать этот блок выполняется только в самом модуле времени выполнения.

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

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

Выполните следующий вывод:

$ python using_name.py

Программа сама по себе работает

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

Описание: Каждый модуль имеет __name__ атрибут, если его значение "__main__", это указывает на то, что модуль сам по себе работает, в противном случае она вводится.


Функция реж ()

内置的函数 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']

Если аргумент не задан, то функция реж () будут перечислены имена всех в настоящее время определены:

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

Стандартный модуль

Python сам с некоторыми из стандартной библиотеки модулей в Python Library Reference документ будет представлен (то есть за "Library Reference Document").

Некоторые модули встроены непосредственно в анализаторе эти языки, хотя и не некоторые встроенные функции, но он был в состоянии использовать очень эффективно, даже звонит на системном уровне не являются проблемой.

Эти компоненты могут быть сконфигурированы в различных формах, основанных на различных операционных системах, таких как модуль Winreg будет доступна только в системе Windows.

Следует отметить, что существует специальный модуль SYS, который встроен в каждый синтаксический анализатор Python. Переменные sys.ps1 и sys.ps2 определяет первичную и вторичную быстрое быстрое соответствующую строку:

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

пакет

Пакет в виде модуля управления пространством имен Python, используя "пунктирные имена модулей."

Например, имя модуля AB, то он сказал, что пакет Суб-модуль B.

При использовании модуля, вам не придется беспокоиться о глобальных переменных между различными взаимодействия модулей, таких как использование точечных имен модулей в этой форме, не волнуйтесь, модуль случая между различными библиотеками одного и того же имени.

Так что разные авторы могут обеспечить модуль NumPy или графическую библиотеку Python.

Давайте предположим, что вы хотите создать единый модуль обработки голоса и файла данных (или называют его "пакет").

Существующие разнообразие различных форматов аудио файлов (в основном отличающихся расширением, например: .wav файл ,:: .aiff файл ,:: .au,), так что вам нужно иметь набор для увеличения модуля между различными форматами.

И для звуковых данных, существует множество различных операций (таких как смешивание, добавление эха, увеличьте функцию эквалайзера, чтобы создать искусственный эффект стерео), который вы также необходим набор, как никогда не закончить модули для обработки этих операций.

Вот возможная структура пакета (в иерархической файловой системе):

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

В Импорт пакета, когда, Python sys.path каталоги, основанные на подкаталог, чтобы найти этот пакет содержит.

Только каталог содержит файл с именем __init__.py будет рассматриваться как пакет, в основном, чтобы избежать некоторых из вульгарного злоупотребления именем (например, называется строка) небрежное влияет на путь поиска действительного модуля.

В простейшем случае, поместите пустой: файл __ init__.py него. Конечно, этот файл может также содержать некоторый код инициализации или (будет описана позже) __all__ переменную.

Каждый раз, когда пользователь может импортировать только конкретный модуль внутри пакета, такие как:

import sound.effects.echo

Это будет импортировать подмодули: sound.effects.echo. Он должен использовать полное имя для доступа:

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

Другой способ введения подмодули являются:

from sound.effects import echo

Она также будет импортировать подмодули: эхо, и ему не нужны эти длинные префикс, так что он мог бы использовать:

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

Еще одно изменение непосредственно вводится в функции или переменной:

from sound.effects.echo import echofilter

Опять же, этот метод будет импортировать подмодули: эхо, и может использовать его функцию echofilter ():

echofilter (вход, выход, задержка = 0,7, ATTEN = 4)

Обратите внимание, что при использовании из пункта импорта пакета в таком виде, когда соответствующий элемент может быть либо внутри пакета субмодулем (суб пакеты) или другие имена внутри определения пакета, таких как функции, класса или переменной.

Синтаксис будет сначала импортировать имя элемента, определенный как пакет, если он не найден, то пытался следовать модуль для импорта. Если не нашли, поздравления, а: отл: ImportError исключение.

С другой стороны, если вы используете эту форму в качестве импорта item.subitem.subsubitem импорта форму, за исключением последнего, то он должен быть пакет, но последний может быть модулем или пакетом, но не может быть именем класса, функция или переменная ,


Импорт из пакета *

Представьте себе, если мы используем от Sound.Effects импорт * Что будет происходить?

Python войдет в файловую систему, найти пакет, который все суб-модулей, один за другим, все из них, чтобы прийти в.

Но, к сожалению, этот метод работает на платформе Windows, не очень хорошо, потому что Windows, является не чувствительны к регистру система.

На этой платформе, никто не может поручиться называется ECHO.py файл импортируется как модуль эхо или Echo или ECHO.

(Например, Windows 95 очень раздражает заглавной первую букву каждого файла отображается) и DOS 8 + 3 именовании будет иметь дело с проблемой длинных имен модулей сделать более запутанной.

Для того, чтобы решить эту проблему, единственная неисправность автора пакета, чтобы обеспечить точный индекс пакета.

Импорт личных данных следующие правила: Если файл описания пакета называется __init__.py существует __all__ список переменных, используя из пакета импорт * время, чтобы поместить все имена в этом списке в качестве содержимого пакета импорта.

Как автор пакета, не забудьте после пакета обновления для обеспечения __all__ также обновленный ах. Вы говорите, что я не буду это делать, я не буду использовать Импорт * это использование, хорошо, никаких проблем, почему не не вы делаете босса. Ниже приведен пример, в: файл: звуки / эффекты / __ init__.py содержит следующий код:

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

Это означает, что при использовании этого использование от Sound.Effects импорта *, вы будете импортировать пакет внутри трех суб-модулей.

Если __all__ действительно не определен, а затем использовать этот синтаксис из Sound.Effects импорта * время, он не импортирует любые подмодули в пакете Sound.Effects. Он просто поместить все содержимое пакета и его Sound.Effects определенной внутри войти в (определенный может быть запущен __init__.py код инициализации).

Это __init__.py, который определяет все имена, чтобы вступить в. И он не уничтожит все явно указанный модуль, прежде чем мы ввели это предложение. Посмотрите на эту часть кода:

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

В этом примере, перед выполнением от ... импорта, пакет Sound.Effects эхо и модули объемного импортируются в текущее пространство имен. (Конечно, даже если вы определяете __all__ без проблем)

Как правило, мы не выступаем за использование этого метода * импортировать модуль, так как часто этот метод приведет к уменьшению читаемости. Но это на самом деле нажатие клавиши может сэкономить много усилий, а некоторые модули предназначены, чтобы стать только импорт через определенный метод.

Помните, что использование пакета от импорта specific_submodule этот метод никогда не будет неправильно. На самом деле, это рекомендуемый метод. Если вы не хотите импортировать суб-модули и подмодули могут иметь другие пакеты одного и того же имени.

Если структура пакета является суб-пакет (например, пример для пакета является звук), и вы хотите импортировать пакет братьев (тот же пакет уровня) вы должны использовать импортный абсолютный путь для импорта. Например, если вы хотите использовать модуль Sound.Filters.vocoder пакете Sound.Effects модули эхо, вы должны написать от Sound.Effects импортировать эхо.

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

Или завуалировано относительный импорт с начала текущего модуля. Имя главного модуля всегда "__main__", основной модуль приложения, использующего Python, вы всегда должны использовать абсолютные пути к ссылкам.

Пакет также обеспечивает дополнительный __path__ свойство. Это список каталогов, каждый из которых имеет каталог, содержащий пакет для этого сервиса __init__.py, вы должны быть выполнены перед другими определены в __init__.py ой. Эта переменная может быть изменена за влияние внутри модуля, включенного в пакет и дочернего пакета.

Эта функция обычно не используется, как правило, используется для расширения пакета внутри модуля.