2011-01-21 6 views
1

J'écris ma première application de bureau et je suis aux prises avec des instances de classe. Cette application est un programme FTP simple utilisant paramiko. Ce que j'ai mis en place jusqu'à présent est un connection.py qui ressemble à ceci ...Problème de connexion 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." 

Assez simple. Connectez-vous et déconnectez. Ce fichier connect.py est importé dans un main.py (ce qui est mon IUG)

#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_()) 

La question se déconnecte. Je pensais que __init__ créerait une instance de la classe Connection(). Si vous regardez sur main.py vous pouvez voir que j'ai essayé de créer la variable self.connectionEstablished afin d'enregistrer l'objet afin que je puisse appeler déconnecter dessus plus tard.

Où est-ce que je me trompe? Je suis relativement nouveau sur python et d'autres langages non-web (je passe la majeure partie de mon temps à écrire des applications RoR et php).

Aucune erreur ne s'affiche à tout moment et j'ai commencé cette application comme une application de terminal, donc je sais que connect.py fonctionne comme prévu.

Edit: Donc, je suppose que Senderle a reçu un message de fermeture de la connexion, ce que j'aimerais voir, mais je ne le suis pas. Je vais marquer une meilleure réponse si je vois quelque chose qui résout mon problème. Edit Résolu: Poussez connect.py et main.py dans un seul fichier pour simplifier les choses. Et pour une raison qui a résolu les choses. Alors, qui sait ce qui se passe. Je vais toujours attendre la meilleure réponse. Si quelqu'un peut me dire pourquoi je ne peux pas avoir un fichier partagé comme ça alors je suis tout ouïe.

+1

Quand conn() est appelé? La fonction init ressemble à la définition de la variable et à la chaîne vide. Sauf si conn() est appelé, self.establishedConnection ne sera jamais configuré. –

+2

Quel est le problème avec la déconnexion? Vous dites "aucune erreur n'est affichée à tout moment", mais vous ne dites pas ce qui ne va pas. – sth

+0

@Karl R: On dirait que conn() est appelé via le widget 'connectButton = self.createButton (" & Connect ", self.conn)'. – senderle

Répondre

1

J'ai essayé le code et ça s'est bien passé. J'ai fait seulement quelques changements.

D'abord, je ne savais pas ce que "utilisateur" et "db" sont, donc j'ai commenté

import user, db 

et

database = db.Database() 

et utilisé mes propres données pour nom d'utilisateur, mot de passe, Deuxièmement, le module PySide n'est pas disponible via mon gestionnaire de paquets, j'ai donc utilisé PyQt4 à la place. Il n'a pas aimé grid.addWidget(self.createList(), 1, 0, 1, 4) donc je l'ai commenté, et tout a fonctionné comme prévu. Remarques supplémentaires: En cas d'erreurs de connexion, il y avait un retour de console constitué de traces de pile, mais rien de plus, et self.establishedConnection restait une chaîne, entraînant l'échec de self.establishedConnection.disconnect(). Alors peut-être qu'il y a un problème de connexion?

EDIT: Aaaahhhhh, je viens de voir ceci: "Aucune erreur n'est affichée à tout moment." Exécutez-vous cela à partir d'un terminal ou double-cliquez sur un exécutable? Si vous le lancez depuis un terminal, je parie que vous verrez des stacktraces dans le terminal. Le GUI ne se ferme pas lorsque le code rencontre une exception.

EDIT2: Si joindre les fichiers résout le problème, alors je suis certain que le problème ne peut avoir rien à voir avec python lui-même. Cela doit être un problème avec Eclipse. Vous dites que connection.py a commencé comme une application terminale, vous devez donc être en mesure d'exécuter des applications python à partir de la ligne de commande. Essayez ce qui suit: mettez main.py, connectez.py, etc. dans un répertoire qui leur est propre, ouvrez un terminal et exécutez python main.py. Si cela fonctionne comme prévu, le problème a quelque chose à voir avec eclipse.

+0

utilisateur était juste un fichier avec des informations simples comme nom d'utilisateur, mot de passe, nom d'hôte et quoi que ce soit. DB était mon fichier db.py qui contenait mes fonctions crud pour sqlite. Je cours ceci d'éclipse. Il ne montre pas de backtraces ou quoi que ce soit ... il se trouve juste là (pour autant que je sache). – Elxx

+0

@Elxx: Ok, ça sonne comme user et db ne sont pas le problème. Je ne sais pas comment éclipse fonctionne, donc je ne peux pas vous conseiller là-bas - mais je suis assez confiant que s'il y a une erreur, il apparaîtra lorsque vous exécutez le programme via un terminal. – senderle

+0

@Elxx: Utilisez-vous le plugin pydev avec eclipse? J'ai essayé et le code fonctionnait toujours. Et quand ce n'est pas le cas, il affiche une traceback dans la console. – senderle

0

Vous n'appelez pas conn() dans le constructeur.

+0

pourquoi vous connecteriez-vous dans le constructeur, quand conn est lié à un bouton? – unbeli

+1

@unbeli - Je suis sûr que la réponse est en réponse à "Je pensais que __init__ créerait une instance de la classe Connection()". Sans plus d'informations, la meilleure estimation est que le PO pourrait avoir des attentes incorrectes. –

+0

@unbeli - Je répondais juste sa question de "Je pensais que __init__ créerait une instance de la classe Connection()" –

Questions connexes