Я хочу написать сценарий clean up
, чтобы избежать неожиданного импорта Python.Найти все пакеты python в проекте
Для лучшего понимания, я покажу вам свои варианты использования.
Иногда мы имеем ситуацию, когда наши папки проекта содержит:
...
my_project/custom.py
my_project/custom/__init__.py
...
Если вы пытаетесь импортировать что-то:
from my_project.custom import some_func
он импортирует из файла custom.py пользовательского каталога вместо.
Я хочу избежать такой ситуации и добавить крючок для проверки, если в родительском каталоге какого-либо пакета python нет файла python (папка с init .py-файл).
Возникает вопрос: Что это самый простой способ, чтобы найти все пакеты Python в моем проекте (все каталоги с инициализации файл .py)
Есть много библиотек Python как: imp
, modulefinder
..., но я не уверен, что они могут просто проверить, если папка является модуль питона с помощью FULLPATH (без загрузки этого пакета)
в конечном итоге я хочу сделать что-то вроде этого:
import os
for folder, sub, files in os.walk('/my/project/root/path'):
# not sure folder or sub, but it doesn't matter
if is_python_module(folder):
# do some stuff
Похоже, я нашел решение:
for folder, sub, file in os.walk(path):
try:
_, module, _ = imp.find_module(folder)
print "Module: %s" % module
except ImportError:
pass
Если есть лучшие решения, не стесняйтесь сказать!
Я знаю, что это семантика, но каталог («папка»), содержащий модули и файл '__init __. Py', называется * пакетом *. Почему вы хотите избежать этой ситуации, в чем проблема? – cdarke
@cdarke, я хочу избежать этой ситуации, потому что, если в вашей первой реализации у вас есть файл custom.py и у вас еще нет пользовательского пакета, все ваши импортные данные импортируются из файла custom.py. Если вы добавите настраиваемую папку (пакет), все ваши старые импорты будут иметь неожиданное поведение. – smart
Поэтому не добавляйте индивидуальный пакет с тем же именем. Извините, что звучит легкомысленно. Коллизии имен не просто зарезервированы для имен модулей/пакетов - кто знает количество сообщений на этом сайте, где кто-то назвал их сценарий так же, как стандартный библиотечный модуль, или дал «переменную» то же имя, что и встроенная функция или класса. Да, это проблема, но она решена с помощью хорошего кода и управления проектами. – cdarke