Можно ли получить доступ к переменным в __init__.py из модулей в одном пакете?

У меня есть пакет hello1, который содержит good.py модуль.

hello1
├── __init__.py
└── good.py

Модуль init имеет переменную A = 1, и мне нужно получить доступ к переменной hello1.A в файле good.py.

import hello1

class Good(object):
    def __init__(self):
        print hello1.A

if __name__ == "__main__":
    g = Good()

Проблема в том, что когда я выполняю python script, я получил ошибку ImportError: 'No module named hello1'. Я могу добавить import sys; sys.path.append("..") в первую строку good.py для быстрого исправления.

Однако good.py находится в пакете hello1, где находится __init__.py, поэтому я задаюсь вопросом, есть ли способ доступа к переменным в __init__.py из модулей в том же пакете.

Ответы

Ответ 2

Если я не ошибаюсь, вы хотите сделать что-то вроде:

python hello1/good.py

Так как good.py является подмодулем пакета, вы не должны его запускать; имейте в виду, что при его непосредственном выполнении он не считается частью пакета hello1, который предотвращает относительный импорт, а текущий каталог - тот, который содержит файл, поэтому hello1 не может быть найден, если он не является 't часть PYTHONPATH. Вместо этого вы можете запустить его с помощью переключателя -m интерпретатора python:

-m mod: запустите библиотечный модуль как script (завершает список опций)

Мне лично не нравится использовать опции интерпретатора для выполнения файла python. Я бы предпочел иметь независимый файл запуска good.py, который импортирует модуль hello1.good и использует его для выполнения того, что он должен делать.

Ответ 3

Если вам не нравится sys.path.append(...), вы можете запустить script как

python -m hello1.good

в каталоге, содержащем "hello1" -каталог, или используйте переменную среды PYTHONPATH вместо sys.path.

Ответ 4

Вы должны явно импортировать константы, которые хотите использовать.

Предпочтительно иметь все ваши константы в файле конфигурации (например, config.py)), а затем, если вы хотите, чтобы они были в пространстве имен пакетов, импортируйте их.

init.py файл:

from package.config import *

более ясно, что путь