Sublime использует собственный встроенный интерпретатор Python (в настоящее время Python 3.3.6, хотя следующая версия также будет поддерживать Python 3.8), и поэтому он будет полностью игнорировать любую версию Python, которую вы можете или, возможно, не установлены в вашей системе, а также в любых библиотеках, которые установлены для этой версии.
По этой причине, если вы хотите использовать внешние модули (далее dependencies
), вам необходимо проделать дополнительную работу. , Существует множество способов сделать это, каждый со своим набором плюсов и минусов.
Ниже перечислены различные способы, которыми вы можете достичь этого; все они требуют некоторого понимания того, как работают модули в Python, чтобы понять, что происходит. По большому счету, за исключением задействованных путей, нет ничего слишком «возвышенного текста» о задействованных механизмах.
ПРИМЕЧАНИЕ: Ниже приведена точность на момент этого ответа. Однако есть планы по управлению пакетами, чтобы изменить его работу с предстоящими зависимостями, которые могут изменить некоторые аспекты этого.
Это относится к следующей версии Sublime, поддерживающей несколько версий Python (и способ их поддержки), который не поддерживается текущим механизмом управления пакетами.
Непонятно в тот момент, если изменение принесет новый способ указания зависимостей или если изменится только внутренняя схема установки зависимостей. Однако существующий механизм может оставаться на месте независимо от обратной совместимости.
Все пути доступа к Python dependency
из плагина Sublime предполагают размещение кода для него в месте, где Python переводчик будет искать его. Это похоже на то, как стандартный Python будет действовать, за исключением того, что проверенные местоположения содержатся в области, которую Sublime использует для хранения вашей конфигурации (называемой каталогом Data
), и вместо автономного интерпретатора Python , Python работает на хосте плагина.
Заполните библиотеку в папку Lib
Начиная с версии 3.0 (сборка 3143), Sublime создаст папку с именем Lib
в каталог данных и внутри него каталог, основанный на имени версии Python. Если вы используете Preferences > Browse Packages
и go на один уровень выше, вы увидите Lib
, а внутри него папку с именем, например, python3.3
(или, если вы используете более новую сборку, python33
и python38
).
По умолчанию эти каталоги находятся непосредственно в Python sys.path
, поэтому все, что находится внутри них, будет немедленно доступно любому плагину, как обычная библиотека Python (или любая из те, что встроены) будут. Вы можете считать эти папки чем-то похожим на папку site-packages
в стандартном Python.
Таким образом, любой метод, с помощью которого вы можете установить стандартную библиотеку Python, может использоваться до тех пор, пока в результате файлы попадают в эту папку. Например, вы можете установить библиотеку с помощью pip
, а затем вручную скопировать файлы в это местоположение из site-packages
, установить вручную из источников и т. Д. c.
Lib/python3.3/
|-- librarya
| `-- file1.py
|-- libraryb
| `-- file2.py
`-- singlefile.py
Здесь действуют ограничения версии; dependency
, который вы хотите использовать, должен поддерживать версию Python, которую использует Sublime, иначе он не будет работать. Это особенно важно для библиотек Python с собственным компонентом (например, .dll
, .so
или .dylib
), для которых может потребоваться ручная компиляция кода.
Этот метод не является автоматическим; вам нужно будет сделать это, чтобы использовать ваш пакет локально, и любой, кто захочет использовать ваш пакет, также должен сделать это. Поскольку Sublime в настоящее время использует более старую версию Python, c также может быть проблематично получить правильную версию библиотек.
В будущем Package Control установит dependencies
в этом месте (будет добавлена папка специально для этой цели во время запуска до версии 3.0), но на момент написания этого ответа, в настоящее время это не так.
Поставляйте свои зависимости непосредственно в ваш собственный пакет
Папка Packages
также находится по умолчанию в sys.path
; так Sublime находит и загружает пакеты. Это относится как к физической папке Packages
, так и к папке «виртуальных» пакетов, которая содержит содержимое файлов sublime-package
.
Например, можно получить доступ к классу, предоставляющему команду exec
, с помощью:
from Default.exec import ExecCommand
Это будет работать, даже если файл exec.py
фактически хранится в Default.sublime-package
в Sublime Text - установочная папка, которая физически отсутствует в папке Packages
.
В результате вы можете vendor
любой dependencies
, который вам требуется, прямо внутри вашего собственного пакета. Здесь это может быть пакет User
или любой другой пакет, который вы создаете.
Важно отметить, что Sublime будет обрабатывать любой файл Python
на верхнем уровне пакета как плагин и пытаться загрузить его как один. Следовательно, важно, что если вы go по этому маршруту создадите подпапку в своем пакете и поместите туда библиотеку.
MyPackage/
|-- alibrary
| `-- code.py
`-- my_plugin.py
С помощью этой структуры вы можете получить прямой доступ к модулю:
import MyPackage.alibrary
from MyPackage.alibrary import someSymbol
Не все Python модули поддаются этому методу напрямую без изменений; некоторые изменения кода в dependency
могут потребоваться для того, чтобы другие части библиотеки могли видеть другие части себя, например, если она не использует относительный import
для доступа к файлам одного уровня. На это также могут повлиять лицензионные ограничения, в зависимости от используемой вами библиотеки.
С другой стороны, это напрямую блокирует версию используемой вами библиотеки, чтобы точно версия, с которой вы тестировали, которая гарантирует, что вы не будете допускать каких-либо непредвиденных сюрпризов в дальнейшем.
Используя этот метод, все, что вы делаете для распространения вашего пакета, будет также автоматически распространять продаваемую библиотеку, которая содержится внутри. Поэтому, если вы распространяете с помощью Package Control, вам не нужно делать ничего особенного, и это будет просто Work ™.
Измените sys.path
, чтобы он указывал на пользовательское местоположение
. Python, встроенный в Sublime, по-прежнему является стандартным Python, поэтому при желании вы можете вручную манипулировать sys.path
, описывающим, в каких папках искать пакеты, чтобы он выглядел в выбранном вами месте в дополнение к стандартному. места, которые Sublime устанавливает автоматически.
Это, как правило, не очень хорошая идея, так как при неправильном выполнении все может go быстро сформироваться. Кроме того, по-прежнему требуется сначала вручную установить библиотеки где-нибудь самостоятельно, и в этом случае вам лучше использовать папку Lib
, как описано выше, которая уже находится на sys.path
.
, я бы посоветовал этот метод - продвинутое решение, которое вы могли бы использовать в целях тестирования во время разработки, но в противном случае это не то, с чем столкнется пользователь. Если вы планируете распространять свой пакет с помощью Package Control, проверка вашего пакета, скорее всего, отменит манипуляцию sys.path
с запросом на использование другого метода.
Используйте систему зависимостей Package Control (и зависимость существует)
Управление пакетами содержит механизм зависимостей , который использует комбинацию двух предыдущих методов, чтобы обеспечить способ автоматической установки зависимости. Существует также список доступных зависимостей , хотя этот список может быть неполным.
Если интересующий вас dependency
уже доступен, вы можете go. Есть два разных способа go заявить, что вам нужна одна или несколько зависимостей от вашего пакета.
ПРИМЕЧАНИЕ : Контроль пакетов в настоящее время не поддерживает зависимости зависимостей; если для зависимости требуется, чтобы была установлена другая библиотека, вам нужно явно указать их обе.
Первая включает добавление ключа dependencies
к записи для вашего пакета в файле канала управления пакетами. , Это шаг, который вы предпримете в тот момент, когда добавляете свой пакет в Package Control, что выходит за рамки этого ответа.
Пока вы разрабатываете свой пакет (или если вы решаете, что не хотите распространять свой пакет с помощью Package Control, когда закончите), вместо этого вы можете добавить dependencies.json
файл в root вашего пакета (примерные зависимости . * 1236) * файл доступен для иллюстрации).
Как только вы это сделаете, вы можете выбрать Package Control: Satisfy Dependencies
из команды Палитра, чтобы Пакет управления загрузками загружал и устанавливал зависимость для вас (при необходимости).
Этот шаг автоматически c, если ваш пакет распространяется и устанавливается с помощью Package Control; в противном случае вы должны указать своим пользователям выполнить этот шаг после установки пакета.
Использовать систему зависимостей Package Control (но зависимость не существует)
Метод, который Control Package использует для установки dependencies
, описан в верхней части темы вопроса. изменить в какой-то момент в (возможно, в ближайшем будущем). Это может повлиять на инструкции здесь. Общий механизм может оставаться тем же, что касается установки, с изменением только местоположения установки, но это еще предстоит выяснить в настоящее время.
Управление пакетами устанавливает зависимости посредством специальной комбинации vendoring
, а также манипуляция с sys.path
, чтобы можно было что-то найти. Для этого требуется, чтобы вы выложили свою зависимость особым образом и также предоставили некоторые дополнительные метаданные.
Макет для пакета, который содержит зависимость, при его создании он будет иметь структура, подобная следующей:
Packages/my_dependency/
├── .sublime-dependency
└── prefix
└── my_dependency
└── file.py
Package Control устанавливает dependency
как Пакет, и поскольку Sublime рассматривает каждый Python файл в root пакета как плагин, код для зависимость не сохраняется на верхнем уровне пакета. Как показано выше, фактическое содержимое зависимости хранится внутри папки, помеченной prefix
выше (подробнее об этом через секунду).
Когда зависимость установлена, Package Control добавляет запись в ее специальный пакет 0_package_control_loader
, который вызывает добавление папки prefix
в sys.path
, что делает все внутри нее доступным для операторов import
как обычно. Вот почему существует внутреннее дублирование имени библиотеки (my_dependency
в этом примере).
Что касается папки prefix
, на самом деле это не так, а вместо этого имеет специальное имя, которое определяет, что сочетание версии Sublime Text, платформы и архитектуры, от которой доступна зависимость (например, важно для библиотек, содержащих двоичные файлы).
Имя папки prefix
фактически соответствует форме {st_version}_{os}_{arch}
, {st_version}_{os}
, {st_version}
или all
. {st_version}
может быть st2
или st3
, {os}
может быть windows
, linux
или osx
и {arch}
может быть x32
или x64
.
Таким образом Вы можете сказать, что ваша зависимость поддерживает только st3
, st3_linux
, st3_windows_x64
или любую их комбинацию. Для чего-то с собственным кодом вы можете указать несколько разных версий, имея несколько папок, хотя обычно all
используется, когда dependency
содержит чистый код Python, который будет работать независимо от версии Sublime, ОС или архитектуры.
В этом примере, если мы предположим, что папка prefix
имеет имя all
, поскольку my_dependency
является чистым Python, то результатом установки этой зависимости будет то, что Packages/my_dependency/all
будет добавлено к sys.path
, что означает, что если вы import my_dependency
получаете код из этой папки.
Во время разработки (или если вы не хотите распространять свою зависимость через управление пакетами), вы создаете Файл .sublime-dependency
в root пакета, как показано выше. Это должен быть текстовый файл с одной строкой, который содержит число 2 di git (например, 01
или 50
). Это определяет, в каком порядке каждая установленная зависимость будет добавлена в sys.path
. Как правило, вы выбираете меньшее число, если ваша зависимость не имеет других зависимостей, и большее значение, если оно есть (чтобы оно вводилось после них).
Как только исходная зависимость выложена в правильном формате в папке Packages
вы должны использовать команду Package Control: Install Local Dependency
из палитры команд, а затем выбрать имя своей зависимости.
Это заставляет Package Control «установить» зависимость (т.е. обновить пакет 0_package_control_loader
), чтобы сделать зависимость активной. Этот шаг обычно выполняется Control Package автоматически, когда он устанавливает зависимость впервые, поэтому, если вы также вручную распространяете свою зависимость, вам необходимо предоставить инструкции для выполнения этого шага.