У меня есть библиотека 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). В конце концов, я надеюсь удалить все глобальные переменные, но пока все работает отлично.
То, что вы описали, будет несовместимо с тем, как работает Python (читайте, если хотите ", я не верю, что вы сделали именно это и получили именно этот результат").
Если вы импортируете lib
из разных мест или по-разному, вы можете оказаться в двух экземплярах, либо в двух экземплярах одного из модулей, либо в одной из lib
-директорий текущей версии, а в другой - установленной lib
. Если вы получаете это "оригинальное"/"новое" поведение, это кажется мне наиболее вероятной причиной.
print lib
в тех местах, где вы его используете, и сравните пути; если они одинаковые, начните сравнивать идентичности объектов модуля. Просмотр sys.modules
также может помочь.