Python слишком динамичен, чтобы делать это на 100% правильно.Учтите, что вы можете импортировать модули, вызвав __import__
, который принимает строковый аргумент, чтобы имя импортируемого модуля можно было создать во время выполнения.Кроме того, __import__
- это функция, поэтому она может быть связана с другими именами, поэтому вы даже не можете быть уверенными в обнаружении всех случаев, когда что-то импортируется.
Итехнически возможно, чтобы модуль вызвал функцию из другого модуля, который импортирует модуль и возвращает его.Таким образом, вы определенно не можете сделать это, проанализировав только пакет b
.
А затем exec
для выполнения произвольного кода Python, созданного во время выполнения ...
Самое близкое, что вы можете получить, это, вероятно, попытаться выполнить ваше модульное тестовое упражнение b
, когда a
находится на PYTHONPATH
, а также когда a
не на PYTHONPATH
.Все еще не надежно, так как это только говорит о том, что b
завершил все тесты без a
на PYTHONPATH
, не то, что ему никогда не понадобится a
для чего-либо.И если вам действительно не повезло, b
делает что-то действительно глупое и возится с sys.path
в полете и все равно каким-то образом умудряется импортировать a
.
Если, однако, это все ваш собственный коди вы знаете, что вы не делаете такую дурацкую чушь, тогда, вероятно, вам лучше всего подойдет простой скрипт, который сканирует файлы на наличие операторов import
.Это, вероятно, очень и очень часто будет работать с произвольным кодом других людей.Просто невозможно сделать работу идеально с полной общностью.