2015-08-14 4 views
0

По какой-то причине я не могу выполнить функцию другого скрипта, даже если я импортировал этот модуль.Python 3.4 - 'module' не имеет атрибута 'send_sms'

Соответствующий код «master_module.py» выглядит следующим образом:

import sms_values 

class ClientThread(threading.Thread): # Class that implements the client threads in this server 
    def __init__(self, client_sock): # Initialize the object, save the socket that this thread will use. 
     threading.Thread.__init__(self) 
     self.client = client_sock 

    def run(self): # Thread's main loop. Once this function returns, the thread is finished and dies. 
     global QUIT # Need to declare QUIT as global, since the method can change it 

     done = False 
     cmd = self.readline() # Read data from the socket and process it 
     while not done: 
      if 'quit' == cmd: 
       self.writeline('Ok, bye. Server shut down') 
       QUIT = True 
       done = True 
      elif 'bye' == cmd: 
       self.writeline('Ok, bye. Thread closed') 
       done = True 
      elif 'send' == cmd: 
       sms_values.send_sms() 
       self.writeline('text should be sent') 
       done = True 
      else: 
       self.writeline(self.name) 
       cmd = self.readline() 

     self.client.close() # Make sure socket is closed when we're done with it 
     return 

Примечание:
Всего код опущен для clarfication того, где ошибка
Там нет __name__ == '__main__' блока в sms_values.py.
send_sms() не определен внутри класса
Отсутствует отступ в строке определения, поэтому он является модульным уровнем.

Здесь я пытаюсь выполнить функцию из другого модуля в поточном сервере с непрерывным запуском с условной «отправкой», написанной в пользовательской консоли.

И это код, я бег, содержащийся в sms_values.py:

def send_sms(): 
    try: 
     ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     port = 80 
     ss.connect((127.0.0.1, port)) 
     a = url.encode('ascii') # string needed to change into bytecode 
     print(sys.stderr, 'sending "%s"' % a) 
     ss.sendall(a) 

     amount_recieved = 0 
     amount_recieved = len(a) 
     while amount_recieved < amount_expected: 
      data = ss.recv(180) 
      amount_recieved += len(data) 
      print(sys.stderr, 'closing socket') 
      ss.close() 

Примечания: Весь код опущен для clarfication того, что функции я звоню.

Довольно прямо, я просто хочу отправить команду http POST/GET маршрутизатору, когда кто-то печатает на сервере непрерывного запуска. Однако флаги Обратное прослеживание вверх это:

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "C:\Python34\lib\threading.py, line 920, in_bootstrap_inner 
    self.run() 
    File "C:\Users\Savag\PycharmProjects\master_module.py", in line 29, in run 
    sms_values.send_sms() 
AttributeError: 'module object has no attribute 'send_sms' 

Может кто-нибудь, пожалуйста, пролить свет на это?
Я вроде подозреваю, что это потому, что я работаю в классе на другом модуле? Я не уверен, что это даже имеет значение. Другие ответы на модуль/атрибуты не отвечают или не помогают в этой ситуации.
Теперь я импортировал другой модуль, from sub_module import sms_values также не работает для меня.

+0

Вы 'def send_sms' внутри блока' if __name__ == '__main __' '? Что вы подразумеваете под «Я работаю в классе на другом модуле»? Определен ли 'send_sms' _inside_ класс? Если строка с индексом 'def' с отступом или находится на уровне модуля? –

+0

Спасибо за быстрый ответ! Nah no, '__name__ == '__main __'' вообще в этом модуле. Хорошо, если вы посмотрите в 'master_module.py', я звоню для выполнения другой функции, но этот код находится внутри функции класса. Мне было интересно, не вызовет ли это проблемы. 'send_sms' не определен внутри класса. 'def send_sms()' не с отступом, не так ли? – Savagefool

+0

В 'sms_values.send_sms()', является ли 'sms_values' фактическое имя модуля? –

ответ

0

Итак, я снова ответил на свой вопрос. Все, что должно было произойти, состояло в том, что модуль должен был быть сохранен до значения. Добавление:

z = sms_values

затем z.sendsms() в петле elif 'send' = cmd:, работал.