Как я могу динамически загружать и выполнять `/foo.py`, если он содержит относительный импорт?Python

Программы на Python
Ответить
Anonymous
 Как я могу динамически загружать и выполнять `/foo.py`, если он содержит относительный импорт?

Сообщение Anonymous »

Если у меня есть /www/code/foo.py и /www/code/bar.py, где foo.py содержит from . панель импорта, я могу сделать следующее для динамической загрузки и выполнения foo.py

Код: Выделить всё

path = '/www/code/foo.py'
spec = importlib.util.spec_from_file_location('code.foo', path)
mod = importlib.util.module_from_spec(spec)
sys.path.append('/www')
spec.loader.exec_module(mod)
Это работает, потому что я даю своему модулю имя с точкой code.foo, поэтому при загрузке модулю будет назначен __pacakge__ папки 'code', и я добавил родительскую папку кода /www в sys.path, чтобы можно было найти пакет кода. Я считаю, что это, по крайней мере, в основном правильно, и в любом случае это работает.
Этот подход не будет работать с /foo.py. Родительской папки нет, поэтому нет возможности присвоить ему имя модуля, разделенное точками, которое затем можно было бы найти в sys.path.
Если я немного покопаюсь, манипулируя sys.path, __package__ и т. д., я, вероятно, смогу получить что-то для обработки этого конкретного случая, но я понятия не имею, действительно ли это безопасно или нет. Есть ли правильный способ использовать механизм импорта для импорта /foo.py? Или мне просто нужно признать, что я не могу импортировать модули из /, содержащие относительный импорт.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ve-imports
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»