1

私は最初のデスクトップアプリを書いていますが、クラスインスタンスで苦労しています。このアプリは、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やその他の非Web言語にかなり慣れていません(ほとんどの時間をRoRおよびphpアプリの作成に費やしています)。

エラーは表示されません。このアプリをターミナルアプリとして起動したので、connect.pyが意図したとおりに機能することはわかっています。

編集:それで、Senderleは接続が閉じられたというメッセージを受け取ったと思います。これも私が見たいものですが、そうではありません。問題を解決する何かを見つけたら、ベストアンサーをマークします。

解決済みの編集:connect.pyとmain.pyを1つのファイルにプッシュして、作業を簡素化しました。そして、何らかの理由でそれは物事を解決しました。だから誰が何が起こっているのか知っています。私はまだ「ベストアンサー」を延期するつもりです。誰かが私がそのような分割ファイルを持つことができない理由を教えてくれるなら、私はすべての耳です。

4

2 に答える 2

1

コードを試してみましたが、問題なく実行されました。少しだけ変更を加えました。

まず、「user」と「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自体とは何の関係もないと確信しています。これは日食の問題であるに違いありません。connection.pyはターミナルアプリとして始まったと言うので、コマンドラインからPythonアプリを実行できる必要があります。次のことを試してください。main.py、connect.pyなどを独自のディレクトリに配置し、ターミナルを開いて、を実行しますpython main.py。期待どおりに機能する場合、問題は日食と関係があります。

于 2011-01-21T21:05:55.183 に答える
0

コンストラクターでconn()を呼び出していません。

于 2011-01-21T20:43:19.020 に答える