Проблема с подключением к Paramiko - PullRequest
1 голос
/ 21 января 2011

Я пишу свое первое настольное приложение и борюсь с экземплярами классов.Это приложение представляет собой простую программу FTP с использованием Paramiko.Пока что я настроил это 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 (это мой графический интерфейс)

#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, чтобы сохранить объект, чтобы позже я мог вызвать для него функцию connect.

Куда я иду не так?Я довольно плохо знаком с Python и другими языками, не относящимися к сети (я трачу большую часть своего времени на написание приложений для RoR и php).

Ошибки не отображаются в любое время, и я запустил это приложение как терминальное приложение, поэтому я знаю, что connect.py работает как положено.

Редактировать: Итак, я думаю, что Senderle получилсообщение закрыто, это то, что я тоже хотел бы увидеть, но это не так.Я отмечу лучший ответ, если увижу что-то, что решает мою проблему.

Правка Решено: Соедините connect.py и main.py в один файл, чтобы упростить задачу.И по какой-то причине это решило проблемы.Итак, кто знает, что происходит.Я все еще собираюсь удержать «лучший ответ».Если кто-то может сказать мне, почему у меня не может быть такого файла, тогда я весь в ушах.

Ответы [ 2 ]

1 голос
/ 22 января 2011

Я попробовал код, и он работал нормально. Я сделал только несколько изменений.

Во-первых, я не знал, что такое "user" и "db", поэтому я прокомментировал

import user, db

и

database = db.Database()

и использовал мои собственные данные для имени пользователя, пароля и т. Д.

Во-вторых, модуль PySide недоступен через мой менеджер пакетов, поэтому вместо него я использовал PyQt4. Это не понравилось grid.addWidget(self.createList(), 1, 0, 1, 4), поэтому я это закомментировал, и все заработало, как и ожидалось.

Дальнейшие размышления: Когда были ошибки соединения, была некоторая консольная обратная связь, состоящая из следов стека, но не более того, и self.establishedConnection оставался строкой, вызывая сбой self.establishedConnection.disconnect(). Так что, возможно, есть проблема с подключением?

РЕДАКТИРОВАТЬ: Aaaahhhhh, я только что видел это: «Никаких ошибок не отображаются в любое время». Вы запускаете это из терминала или дважды щелкаете по исполняемому файлу? Если вы запустите его из терминала, держу пари, вы увидите в стеке трассировки стека. Графический интерфейс не закрывается, когда код попадает в исключение.

EDIT2: Если объединение файлов устраняет проблему, то я уверен, что проблема не может иметь ничего общего с самим питоном. Это должно быть проблемой с затмением. Вы говорите, что connection.py начинался как терминальное приложение, поэтому вы должны иметь возможность запускать приложения python из командной строки. Попробуйте следующее: поместите main.py, connect.py и т. Д. В собственную директорию, откройте терминал и запустите python main.py. Если это работает как ожидалось, то проблема как-то связана с затмением.

0 голосов
/ 21 января 2011

Вы не вызываете conn () в конструкторе.

...