2013-08-09 5 views
0

Я не могу показаться, чтобы выяснить, где проблема,AttributeError: экземпляр не имеет атрибута, в пределах __init__

ошибка:

Traceback (most recent call last): 
    File "./miningScreensaver", line 171, in <module> 
    miningScreensaver().loop.run() 
    File "./miningScreensaver", line 81, in __init__ 
    self.rxAddress = self.getRxAddress 
AttributeError: miningScreensaver instance has no attribute 'getRxAddress' 

код:

#! Python 
class miningScreensaver: 
    def __init__(self): 
     DBusGMainLoop(set_as_default=True) 
     self.mem='ActiveChanged' 
     self.dest='org.gnome.ScreenSaver' 
     self.bus=SessionBus() 
     self.loop=MainLoop() 
     self.bus.add_signal_receiver(self.catch,self.mem,self.dest) 
     self.pipe = "" 

     #if you would like to specify a different rx address 
     # change rxAddress to the desired rx address 
     self.rxAddress = self.getRxAddress() #<--------------------ERROR HERE line 81 
     #self.rxaddress = "18X3TEigc6PVTsF9Atx5br7rEXfuZRqXEz" 

    def catch(self,ssOn): 
     if ssOn == 1: #Screensaver turned on 
      self.start() 
     else: #Screensaver turned off 
      self.stop() 

    def start(self): 
     self.pipe = Popen(["cgminer -o stratum+tcp://stratum.mining.eligius.st:3334 -u " + self.rxAddress + " -p x -I 9"], shell=True) 

    def stop(self): 
     self.pipe.kill() 

    def getRxAddress(self): 
     #check if bitcoin.conf exists 
     cmd = "ls $HOME/.bitcoin/bitcoin.conf" 
     pipe = Popen(cmd,stdout=PIPE,stderr=STDOUT) 
     pout = pipe.stdout.read() 
     pout = pout.split() 
     if pout[len(pout)-5]=='No' and \ 
      pout[len(pout)-4]=='such' and \ 
      pout[len(pout)-3]=='file' and \ 
      pout[len(pout)-2]=='or' and \ 
      pout[len(pout)-1]=='directory\n': 
      password = self.createBitConf()  
     else: 
      #check password 
      password = self.checkPassword() 

     #Launch bitcoin-qt -server 
     Popen(["bitcoin-qt","-server"]) 
     #Access 
     access = ServiceProxy("http://darkPenguin:"+password+"@127.0.0.1:8332") 
     #access.getinfo() 
     return access.listreceivedbyaddress(0) 
     #access.sendtoaddress("12yBwyDJHABCvohdT8qBTeMJEYDqpXnVYV", 0.01) 

    def createBitConf(self): 
     randomPW = self.createRandomPW() 
     path = expanduser("~") + "/" 
     defFile = open("bitosbitcoinconf", "r") 
     newFile = open(path + ".bitcoin/bitcoin.conf","w") 
     for line in range(1,55): 
      newFile.write(defFile.readline()) 
     password = "rpcpassword="+randomPW+"\n" 
     for line in range(56,110): 
      newFile.write(defFile.readline()) 
     defFile.close() 
     newFile.close() 
     return randomPW 

    def createRandomPW(self): 
     myrg = random.SystemRandom() 
     length = 44 
     alphabet = string.ascii_letters + string.digits 
     pw = str().join(myrg.choice(alphabet) for _ in range(length)) 
     return pw 

    def checkPassword(self): 
     path = expanduser("~") + "/" 
     bitConfFile = open(path + ".bitcoin/bitcoin.conf","r") 
     password = bitConfFile.readline(56) 
     bitConfFile.close() 
     return password[12:12+44-1] # "rpcpassword="+randomPW+"\n" 

miningScreensaver().loop.run() 

Это ведет я батти, как метод вызова, так и метод пишутся точно так же, и решения проблем других народов не помогли.

+2

Ваша ошибка не соответствует вашему коду. Вы изменили свой код с тех пор, как получили эту ошибку? Перезапустите его и посмотрите, что произойдет. (Кроме того, настоятельно рекомендуется, чтобы любые классы, которые не наследуют ничего, вместо этого наследуют от 'object'. В противном случае вы получите классы старого стиля, которые сосут.) – user2357112

+1

Как совершенно не связанная с вашей проблемой проблема обратите внимание, что выполнение команды «Popen» в 'ls' и синтаксический анализ сообщения об ошибке должно быть самым запутанным способом, который я когда-либо видел, чтобы проверить, существует ли файл ... – abarnert

+1

Проверьте ваш отступ? «GetRxAddress» может быть разделен так, что это функция, определенная после класса, а не метод. – GP89

ответ

2

У вас есть смешанные вкладки и пробелы. Установите редактор, чтобы отобразить пробелы, и вы увидите проблему. Запуск python с опцией -tt может помочь.

2

Быстрая проверка кнопкой «Редактировать» показывает, что вы смешиваете вкладки и пробелы.

В частности, первые несколько методов miningScreensaver имеют отступы в виде множества пространств, в то время как остальные, включая getRxAddress, отступают от вкладки. Таким образом, Python считает, что эти методы должны быть разделены вне класса, что означает, что они скомпилированы как функции верхнего уровня, а не методы экземпляров miningScreensaver.

Чтобы исправить это, раскройте свой код и вручную очистите отступ.

Чтобы избежать этого в будущем, используйте лучший текстовый редактор и запустите Python с флагом -t или -tt, чтобы он дал очевидную ошибку в отношении несогласованного использования таблиц и пробелов вместо того, чтобы пытаться разобрать код и дать вы ошибка, которую вы не можете понять.

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

  • Нет связанных вопросов^_^