Библиотеки действуют по-разному в зависимости от того, установлены они или нет

1

У меня есть библиотека Python, которую я написал, которая действовала на меня. У меня есть набор переменных, которые меняют способ работы библиотеки. При тестировании все работало нормально, но когда я python lib.py install переменные не влияют на библиотеку. Я применил это к самому простому примеру:

Библиотека:

    ##lib.py
    config="Original"

    def run():
        print config

Автор сценария:

    import lib

    lib.config="New"
    lib.run()
    print lib.config

Если вы поместите библиотеку в тот же каталог, что и скрипт, и запустите его, выполните следующие действия:

    New
    New

Но если вы установите библиотеку, а затем попробуйте сценарий, используя библиотеку из dist-пакетов, выход будет следующим:

    Original
    New

Может кто-нибудь объяснить, что происходит? Я немного смущен и ужасно заинтересован в событиях и причинах. Кроме того, я делаю программную конфигурацию совершенно неправильно?

редактировать

Оказывается, проблема заключается в файле init.py. Это в основном как импорт библиотеки, которая просто импортирует другую библиотеку. Когда вы импортируете установленный модуль, он смотрит на папку lib и файл init.py. init.py - это всего лишь один лайнер from lib import *. Он просто притворяется реальной библиотекой, но это вызывает странную проблему, если вы используете глобальную переменную. Симулированный пример того, что происходит в основном:

##init.py
from lib import *

Автор сценария:

import init

init.config = 'New'
init.run()
print init.config

Вывод:

Original
New

Функция run() ищет config в lib.py, но print init.config ищет ее в init.py. Спасибо всем за помощь. Исправить - изменить способ установки модуля (нет init.py). В конце концов, я надеюсь удалить все глобальные переменные, но пока все работает отлично.

  • 0
    Конфигурация обычно должно быть в объектно-экземпляр , а не статический (глобальный), если нет действительно хорошая причина сделать это статически. И даже в этом случае экземпляры объектов должны поддерживать переопределение любого вида глобальной конфигурации.
  • 1
    Также я не могу воспроизвести это поведение на Python 2.6.6.
Показать ещё 1 комментарий
Теги:

1 ответ

2

То, что вы описали, будет несовместимо с тем, как работает Python (читайте, если хотите ", я не верю, что вы сделали именно это и получили именно этот результат").

Если вы импортируете lib из разных мест или по-разному, вы можете оказаться в двух экземплярах, либо в двух экземплярах одного из модулей, либо в одной из lib -директорий текущей версии, а в другой - установленной lib. Если вы получаете это "оригинальное"/"новое" поведение, это кажется мне наиболее вероятной причиной.

  • 0
    Я тоже думал, что это может быть причиной. Поэтому я не назвал две библиотеки одинаковыми. Я также согласен с вами, что Python работает не так, поэтому меня это удивляет.
  • 0
    @trydyingtolive: затем, чтобы попытаться определить его, print lib в тех местах, где вы его используете, и сравните пути; если они одинаковые, начните сравнивать идентичности объектов модуля. Просмотр sys.modules также может помочь.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню