Paramiko连接问题

时间:2011-01-21 19:13:44

标签: python desktop-application paramiko

我正在编写我的第一个桌面应用程序而且我正在努力处理类实例。这个应用程序是一个使用paramiko的简单ftp程序。到目前为止我设置的是一个看起来像这样的connection.py ......

#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以保存对象,以便稍后可以调用disconnect。

我哪里错了?我是python和其他非网络语言的新手(我大部分时间都在编写RoR和php应用程序)。

任何时候都没有显示任何错误,我将此应用程序作为终端应用程序启动,因此我确实知道connect.py可以正常运行。

编辑:所以我猜Senderle得到了一个连接已关闭的消息,这也是我想看到的,但我不是。如果我看到能解决问题的东西,我会给出最好的答案。

编辑已解决:将connect.py和main.py推送到一个文件中以简化操作。由于某种原因解决了问题。谁知道最近发生了什么。我仍然会推迟'最佳答案'。如果有人能告诉我为什么我不能拥有这样的分割文件那么我就听见了。

2 个答案:

答案 0 :(得分: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不会关闭。

EDIT2:如果加入文件修复了问题,那么我确定问题不能与python本身有任何关系。这必须是eclipse的问题。你说connection.py最初是作为终端应用程序开发的,所以你必须能够从命令行运行python应用程序。尝试以下操作:将main.py,connect.py等放在他们自己的目录中,打开一个终端,然后运行python main.py。如果它按预期工作,那么问题与eclipse有关。

答案 1 :(得分:0)

您没有在构造函数中调用conn()。