2011-01-21 95 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()。