2011-01-21 99 views
1

我正在寫我的第一個桌面應用程序,我正在努力與類實例。這個程序是一個簡單的FTP程序使用paramiko。到目前爲止我設置的是一個connection.py,看起來像這樣...Paramiko連接問題

#connect.py 

import user, db 
import paramiko, time, os 

paramiko.util.log_to_file('paramiko-log.txt') 
class Connection: 
    def __init__(self): 
     #Call DB Functions 
     database = db.Database() 
     #Set Transport 
     self.transport = paramiko.Transport((user.hostname, user.port)) 

     #User Credentials 
     username = user.username 
     password = user.password 
     self.transport.connect(username = username, password = password) 

     self.sftp = paramiko.SFTPClient.from_transport(self.transport) 

     print "Set your credentials in user.py for now!" 
     msg = "Connecting as: %s, on port number %d" % (user.username, user.port) 
     print msg 

    def disconnect(self): 
     print "Closing connection..." 
     self.sftp.close() 
     self.transport.close() 
     print "Connection closed." 

非常簡單。連接並斷開連接。 這connect.py文件被導入到main.py(這是我的GUI)

#main.py 

import connect 
from PySide import QtCore, QtGui 

class Window(QtGui.QWidget): 

    def __init__(self, parent=None): 
     super(Window, self).__init__(parent) 
     windowWidth = 550 
     windowHeight = 350 

     self.establishedConnection = "" 

     connectButton = self.createButton("&Connect", self.conn) 
     disconnectButton = self.createButton("&Disconnect", self.disconnect) 
     grid = QtGui.QGridLayout() 
     grid.addWidget(connectButton, 3, 3) 
     grid.addWidget(disconnectButton, 4, 3) 
     grid.addWidget(self.createList(), 1, 0, 1, 4) 

     self.setLayout(grid)  

     self.resize(windowWidth, windowHeight) 
     self.setWindowTitle("FTP Program") 

    def conn(self): 
     connection = connect.Connection() 
     self.establishedConnection = connection 

    def disconnect(self): 
     self.establishedConnection.disconnect() 

    def createButton(self, text, member): 
     button = QtGui.QPushButton(text) 
     button.clicked.connect(member) 
     return button 

if __name__ == '__main__': 

    import sys 

    app = QtGui.QApplication(sys.argv) 
    gui = Window() 
    gui.show() 
    sys.exit(app.exec_()) 

問題被斷開。 我在想__init__會創建一個Connection()類的實例。如果你看看main.py,你可以看到我試圖創建變量self.connectionEstablished以保存對象,以便稍後可以調用斷開連接。

我哪裏錯了?我對python和其他非web語言相當陌生(我花了大部分時間寫RoR和php應用程序)。

任何時候都不會顯示任何錯誤,並且我作爲終端應用程序啓動了此應用程序,所以我確實知道connect.py確實按預期工作。

編輯:所以我想Senderle得到了一個連接關閉的消息,這也是我想看到的,但我不是。如果我看到解決我的問題的東西,我會標記出最佳答案。

編輯解決方案:將connect.py和main.py壓入一個文件以簡化操作。出於某種原因解決了這些問題。所以誰知道發生了什麼。我仍然堅持'最佳答案'。如果有人能告訴我爲什麼我不能有這樣的分割文件,那麼我全都是耳朵。

+1

何時調用conn()? init函數看起來只是將變量設置爲空字符串。除非調用conn(),否則self.establishedConnection永遠不會被設置。 – 2011-01-21 19:19:39

+2

斷開連接的問題究竟是什麼?你說「任何時候都不顯示錯誤」,但是你不會說出哪種方式出了問題。 – sth 2011-01-21 19:20:28

+0

@Karl R:看起來像是通過`connectButton = self.createButton(「&Connect」,self.conn)`小部件調用conn()。 – senderle 2011-01-21 20:50:30

回答

1

我試過了代碼,它運行良好。我只做了一些改變。

首先,我不知道什麼是 「用戶」 和 「DB」 是的,所以我註釋掉

import user, db 

database = db.Database() 

,並用我自己的數據,用戶名,密碼,

其次,PySide模塊不能通過我的包管理器,所以我用PyQt4代替。它不喜歡grid.addWidget(self.createList(), 1, 0, 1, 4)所以我評論說,一切都按預期工作。

進一步的想法:當有連接錯誤時,有一些控制檯反饋包含堆棧跟蹤,但沒有更多,並且self.establishedConnection仍然是一個字符串,導致self.establishedConnection.disconnect()失敗。所以也許有一個連接問題?

編輯:Aaaahhhhh,我剛剛看到這個:「沒有錯誤顯示在任何時間。」你是從終端運行這個還是雙擊可執行文件?如果你從一個終端開始它,我敢打賭你會在終端看到堆棧軌跡。當代碼遇到異常時,gui不會關閉。編輯2:如果加入文件修復了問題,那麼我肯定這個問題不能與python本身有任何關係。這在eclipse中必須是一個問題。你說connection.py是作爲一個終端應用程序開始的,所以你必須能夠從命令行運行python應用程序。嘗試以下操作:放入main.py,連接。py等在自己的目錄下,打開一個終端,並運行python main.py。如果它按預期工作,那麼這個問題與日食有關。

0

你不是在構造函數中調用conn()。