2011-12-28 4 views
2

это, наверное, немой вопрос, но не был уверен, что еще делать.Как импортировать другой внешний модуль python?

main.py

import module2 
global x 
hello="Hello" 
x=module2.message() 
x.say() 

module2.py

class message: 
    def say(): 
     print hello 

Когда я печатаю привет, я имею в виду переменную привет в main.py однако этот метод возвращает ошибку. Кто-нибудь знает решение? (я бы предпочел не переводить переменную hello в функцию)

ответ

3

Единственное надежное решение называется инкапсуляция.

Так, в принципе, вы можете изменить свой код, чтобы выглядеть:

main.py

import module2 

global x 
hello="Hello" 
x=module2.message(hello) 
x.say() 

module2.py

class message: 
    def __init__(self, hello): 
     self.hello = hello 
    def say(): 
     print self.hello 

Plus пытаются следовать кодирования стиль Python - жизнь вам и будущим разработчикам вашего кода будет проще.

+0

Ах да, я действительно не хотел использовать этот метод, но я полагаю, что это единственный вариант. – thelost

2

Несколько вариантов, но обратите внимание, что один модуль не может получить доступ к вызывающему модулю напрямую.

  1. Просто передайте hello как переменную (def say(msg): print msg)
  2. Пасс все переменные в main.py к module2: def say(g): print g['hello'] и say(globals())
  3. магазин это где-то, а затем извлечь его, когда вам это нужно.
1

С main.py импорт module2.py, вы можете получить доступ к глобалам, определенным в moule2 в главном.

В вашем случае, так как module2 не импортирует главную, поэтому глобальные функции в главном не доступны в модуле2.

один раствор, который определяется @Tadeck

1

В этом конкретном примере, это совершенно нормально для module2.py импортировать main.py, есть некоторые Гоча, хотя.

Наиболее очевидным является то, что main.py, вероятно, запускается из командной строки, например python main.py, что приводит к тому, что этот файл считает, что он называется __main__. Вы можете импортировать этот модуль в module2, но это нечто необычное; он называется «main.py», и вы хотите import main. Это приведет к тому, что модуль будет импортирован второй раз.

Для этого должно быть выполнено, чтобы импортировать файл без побочных эффектов , если он не импортирован как__main__. Очень распространенная идиома в python - проверить это условие в конце модуля.

import module2 
global x 
hello="Hello" 

def main(): 
    x=module2.message() 
    x.say() 

if __name__ == '__main__': 
    main() 

А теперь это просто отлично для module2.py фактически импортировать main. С другой стороны, импортировать переменные из одного модуля в другой трудно предсказать, когда импорт может быть рекурсивным, у вас может еще не быть этой переменной, потому что модуль уже пытается импортировать вы. С другой стороны, всегда безопасно ссылаться на переменную в модуле с использованием точечного синтаксиса. Так что ваш module2.py должно быть:

import main 
class message: 
    def say(): 
     print main.hello 

что также делает его более очевидным, только когда hello пришли.

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