2010-01-18 3 views
1

Начинающий Python, поэтому прошу прощения, если у этого вопроса есть простой ответ. (Надеюсь, да.)«Предварительно импортировать» переменную в модуль

Я работаю над модулем python - плагином для более крупной программы. Я пытаюсь разработать модуль с помощью Eclipse IDE (с pydev), что означает, что мне нужно иметь возможность запускать этот модуль автономно, т. Е. Не как плагин из более крупной программы.

Я на самом деле разобрал много волосатых деталей этого, в основном из-за создания своего рода «упряжи», который запускает плагин из моей IDE таким образом, который имитирует (с точки зрения плагина) запускается из его реальной операционной среды.

Но одна вещь ускользает от меня. Когда модуль запускается из «реальной» среды, он каким-то образом имеет определенное имя (назовем его «Боб»), уже определенное в его результатах dir(). Когда я запускаю его в своей собственной среде, «Боб» не появляется в каталоге dir(), если я не загружу его вручную.

Естественно, если я написал код для загрузки «Боба» вручную, чтобы плагин работал в моей среде IDE, что мешает плагину, когда он работает «по-настоящему». Мне нужна помощь: Как мне загрузить мой плагин (через мой пусковой узел) с загруженным «Бобом»?

Наивно, я как бы надеюсь, что смогу «заставить» плагин импортировать «Боб» каким-то образом, фактически не добавив «import Bob» к самому плагину. Но я открыт для предложений по лучшему пути ...?

ответ

2

Предположительно, когда вы запускаете его «автономно» под Eclipse (или «автономным» без Eclipse, если на то пошло, так же, как «python foobar.py» в командной строке), глобальная переменная вашего модуля __name__ имеет значение '__main__' (если модуль импортируется, вместо этого значение глобальной переменной будет 'foobar' - или, тем не менее, имя модуля).

Так, просто сделать

if __name__ == '__main__': 
    import Bob 

и вы можете иметь Боб импортирован, когда ваш модуль работать автономно, без какого-либо негативного эффекта, когда ваш модуль вместо получения import-е изд.

+0

Согласен. Это заявление должно быть частью вашей упряжи. – inspectorG4dget

+0

А, да, это работает. Спасибо. Из любопытства, знаете ли вы, что вы, ребята, знаете, как «настоящая» программа (которая вызывает мой плагин) позволяет добавить имя в dir() без плагина, явно не импортируя его? (Я предполагаю, что имя должно соответствовать модулю, переменной или классу ...) – Xanatos

+0

@Xanatos, 'import foobar; foobar.Bar = 'zapzap'' будет делать это (обычно это не лучшая практика, но определенно не сложно). «Явно» не имеет большого значения - независимо от того, как происходит импорт ('__import__', что угодно), объект модуля заканчивается как' sys.modules ['foobar'] ', поэтому он всегда может быть затронут таким образом. –

Смежные вопросы