3

Pythonを使用してファイルをsftpしようとしていますが、コードはインタラクティブシェルでうまく機能し、一度に貼り付けることもできます。

ファイルをインポートしようとすると(コンパイルするためだけに)、例外や明らかなエラーなしでコードがハングします。

コードをコンパイルするにはどうすればよいですか、または他の方法でsftpを実行するコードが機能している人はいますか?

このコードは、ssh.connect()ステートメントですぐにハングします。

"" "ProblemDemo.py
    paramikoデモファイルから切り刻まれました。

    このコードはシェルで機能しますが、インポートしようとするとハングします。
"" "
時間からインポートスリープ
OSのインポート

paramikoをインポートします


sOutputFilename = "redacted.htm"#-ペイロードファイル

hostname = "redacted.com"
#### -  警告!埋め込まれたパスワード!できるだけ早く削除します。
sUsername="編集済み"
sPassword="編集済み"
sTargetDir="編集済み"

#-ホストキーがわかっている場合は、それを取得します。
hostkeytype=なし
ホストキー=なし
host_keys = {}
試す:
    host_keys = paramiko.util.load_host_keys(os.path.expanduser('〜/ .ssh / known_hosts'))
IOErrorを除く:
    試す:
        #Windowsは〜/ .ssh /という名前のフォルダを持つことができないため、〜/ssh/も試してください
        host_keys = paramiko.util.load_host_keys(os.path.expanduser('〜/ ssh / known_hosts'))
    IOErrorを除く:
        print'***ホストキーファイルを開くことができません'
        host_keys = {}

host_keys.has_key(hostname)の場合:
    hostkeytype = host_keys [hostname] .keys()[0]
    hostkey = host_keys [hostname] [hostkeytype]
    print'タイプ%sのホストキーを使用'%hostkeytype


ssh = paramiko.Transport((hostname、22))

ssh.connect(username = sUsername、password = sPassword、hostkey = hostname)

sftp = paramiko.SFTPClient.from_transport(ssh)

sftp.chdir(sTargetDir)

sftp.put(sOutputFilename、sOutputFilename)

ssh.close()

4

3 に答える 3

5

インポート時にこの種のコードを実行するのは確かに悪い考えですが、なぜハングするのかはわかりません-インポートメカニズムがparamikoとうまく相互作用しない奇妙なことをしている可能性があります(スレッド関連の問題かもしれませんか?)。とにかく、通常の解決策は、関数を関数に実装することです。

def my_expensive_function(args):
    pass

if __name__ == '__main__':
    import sys
    my_expensive_functions(sys.args)

このように、モジュールをインポートするだけでは何も実行されませんが、スクリプトを実行すると、コマンドラインで指定された引数を使用して関数が実行されます。

于 2009-06-18T15:09:50.207 に答える
1

これは直接的な理由ではないかもしれませんが、インポート時に「機能」を実行したいと思うことはめったにありません。通常、次のように呼び出すクラスまたは関数を定義する必要があります。

import mymodule
mymodule.run()

インポートで実行する「グローバル」コードは、通常、インポート、変数定義、関数およびクラス定義などに限定する必要があります。

于 2009-06-18T14:54:21.957 に答える
0

奇妙さはさておき、私はコードをコンパイルするためにインポートを使用していました。スクリプトを関数に変えることは、この種のアプリケーションにとって不必要な複雑さのように思えます。

コンパイルするための代替手段を検索して見つけました:

py_compileをインポートする
py_compile.compile( "ProblemDemo.py")

これにより、意図したとおりに機能するpycファイルが生成されました。したがって、学んだ教訓は、インポートはPythonスクリプトをコンパイルするための堅牢な方法ではないということです。

于 2009-06-18T15:29:12.617 に答える