Python - преобразование импорта в формат модуля - PullRequest
0 голосов
/ 14 марта 2020

У меня есть пакет Python, который структурирован с использованием импорта, как если бы скрипт запускался из root пакета. Таким образом, структура выглядит примерно так:

foo/
    script.py
    bar/
        import_a.py
    bar_two/
        import_b.py

И импорт в пакетах более низкого уровня, например, в import_b.py, структурирован как

from bar import import_a

Очевидно, это нарушается, если вы хотите реструктурировать это как пакет вместо запуска скриптов из каталога root. Мне нужно заново выполнить все операторы импорта и добавить файлы __init__.py в каждый подкаталог (это в python 2.7, так как я должен использовать это с уже существующим ro kineti c repo, тогда как первоначальное repo было в python 3).

Мой вопрос двоякий: есть ли простой метод / скрипт для преобразования импорта, и есть ли какой-нибудь способ автоматической генерации соответствующего __init__. пи-файлы?

1 Ответ

0 голосов
/ 15 марта 2020

С точки зрения Python 2.7 это даже не пакет, поскольку он пропускает все файлы __init__.py (а пакеты пространства имен тогда еще не существовали). Так что нет никакого способа создать эти __init__.py файлы. Но это должно быть относительно легко. Вы можете использовать следующий фрагмент Python из root пакета (to-be-):

import os

for item in os.walk('.'):
    path = item[0]
    with open(os.path.join(path, '__init__.py'), 'w') as fh:
        pass

Для модификации операторов import есть способ обойти это. При импорте пакета вы можете добавить путь к файлу сценария root __init__.py в sys.path. То есть вы можете добавить следующий код в foo/__init__.py в самом верху:

import os
import sys
sys.path.append(os.path.split(__file__)[0])

Таким образом, весь импорт может быть решен путем поиска в этом каталоге.

...