Как определить разницу между отсутствующим модулем и немодульным импортом при сбое find_spe c? - PullRequest
0 голосов
/ 30 марта 2020

Я работаю над проектом, который предполагает прохождение кода python через импорт. Чтобы найти местоположение исходного файла модуля, я использую find_spe c из importlib.util (рекомендуемый способ для python 3.4 +).

Для multiprocessing.freeze_support find_spe c не может найти информация о модуле для полного пути (возвращается None). Я думаю это так, потому что multiprocessing.freeze_support является функцией (а не модулем). Тем не менее, то же самое поведение проявляется при попытке импортировать модуль (или подмодуль), который не существует.

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

Я хотел бы избежать загрузки рассматриваемого модуля, поскольку он медленнее, а find_spe c в основном хорош, потому что его избегают.

Python 3.6.9 (default, Jan 15 2020, 11:00:36)
[GCC 4.2.1 Compatible Apple LLVM 11.0.0 (clang-1100.0.33.16)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from importlib.util import find_spec
# This works fine
>>> find_spec("multiprocessing")
ModuleSpec(name='multiprocessing', loader=<_frozen_importlib_external.SourceFileLoader object at 0x10bb19d68>, origin='/Users/ddrexler/.pyenv/versions/3.6.9/lib/python3.6/multiprocessing/__init__.py', submodule_search_locations=['/Users/ddrexler/.pyenv/versions/3.6.9/lib/python3.6/multiprocessing'])
# Returns None because freeze_support is a function
>>> find_spec("multiprocessing.freeze_support")
# Returns None because fake doesn't exist
>>> find_spec("multiprocessing.fake")
# I would rather not do this, but obviously you can check with import:
>>> from multiprocessing import freeze_support
>>> from multiprocessing import fake
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name 'fake'
...