Какие проблемы с будущими сторонними пакетами можно ожидать, если удалить ненужные Python3 основные модули - PullRequest
0 голосов
/ 28 января 2020

У меня есть среда с некоторыми крайними ограничениями, которые требуют от меня уменьшить размер планируемой установки Python 3.8.1. Операционная система не подключена к inte rnet, и пользователь никогда не откроет интерактивную оболочку и не подключит отладчик.

Существует, конечно, много способов сделать это, и один из способов - это я. исследование заключается в удалении некоторых основных модулей, например python3-email. Я обеспокоен тем, что есть сторонние пакеты, которые будущие разработчики могут включить в свои приложения, которые имеют неиспользуемые, но необходимые зависимости от основных функций python. Например, если отсутствует python3-email, какие сторонние пакеты могут не работать , что можно ожидать также ? Если разработчик решит использовать пакет ведения журнала, содержащий класс 10000 *, на который нет ссылок, в ссылочном модуле, он сломается просто потому, что в верхней части отображается import email.

Существуют ли требования или рекомендации по разработке пакета, которые адрес это?

Ответы [ 2 ]

1 голос
/ 29 января 2020

Это интересный вопрос, но он слишком широкий, чтобы здесь можно было четко ответить. Короче говоря, ожидается, что стандартная библиотека Python всегда будет там, хотя иногда она разбивается на несколько частей (например, Debian). Но вы говорите это сами, вы не знаете, каковы ваши требования, поскольку вы еще не знаете, какие пакеты future будут запускаться на этом интерпретаторе ... На это невозможно ответить. Одна вещь, которую вы могли бы сделать, это использовать что-то вроде modulefinder в будущем коде, прежде чем запускать его на этом ограниченном Python интерпретаторе.

0 голосов
/ 11 февраля 2020

Мне удалось найти решение. Эту проблему лучше всего описать как каскадный импорт . Можно остановить загрузку модуля, добавив запись в sys.modules. Например, при импорте asyncio module ssl и _ssl будут загружены модули, даже если они не нужны за пределами ssl. Это можно остановить с помощью следующего кода. В этом можно убедиться, увидев, что процесс python меньше на 3 МБ, но также с помощью перехватчиков загрузки модуля, чтобы наблюдать за каждым модулем, когда он загружается:

import importhook
import sys
sys.modules['ssl'] = None

@importhook.on_import(importhook.ANY_MODULE)
def on_any_import(module):
    print(module.__spec__.name)
    assert module.__spec__.name not in ['ssl', '_ssl']

import asyncio

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...