Frage

Ich versuche, Python zu verwenden, um eine Datei SFTP, und der Code funktioniert gut in der interaktiven Shell -. Sogar in auf einmal einfügen

Wenn ich versuche, die Datei zu importieren (nur zu kompilieren), hängt der Code ohne Ausnahmen oder offensichtliche Fehler.

Wie erhalte ich den Code zu kompilieren, oder jemand funktionierenden Code hat, die SFTP durch ein anderes Verfahren erreicht?

Dieser Code hängt direkt am ssh.connect () Erklärung:

""" ProblemDemo.py
    Chopped down from the paramiko demo file.

    This code works in the shell but hangs when I try to import it!
"""
from time           import sleep
import os

import paramiko


sOutputFilename     = "redacted.htm"  #-- The payload file

hostname    = "redacted.com"
####-- WARNING!  Embedded passwords!  Remove ASAP.
sUsername   = "redacted"
sPassword   = "redacted"
sTargetDir  = "redacted"

#-- Get host key, if we know one.
hostkeytype = None
hostkey     = None
host_keys   = {}
try:
    host_keys = paramiko.util.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
except IOError:
    try:
        # try ~/ssh/ too, because windows can't have a folder named ~/.ssh/
        host_keys = paramiko.util.load_host_keys(os.path.expanduser('~/ssh/known_hosts'))
    except IOError:
        print '*** Unable to open host keys file'
        host_keys = {}

if host_keys.has_key(hostname):
    hostkeytype = host_keys[hostname].keys()[0]
    hostkey     = host_keys[hostname][hostkeytype]
    print 'Using host key of type %s' % hostkeytype


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

ssh.connect(username=sUsername, password=sPassword, hostkey=hostkey)

sftp    = paramiko.SFTPClient.from_transport(ssh)

sftp.chdir (sTargetDir)

sftp.put (sOutputFilename, sOutputFilename)

ssh.close()

War es hilfreich?

Lösung 3

Verrücktheit beiseite, ich habe nur Import mit dem Code zu kompilieren. Drehen Sie das Skript in eine Funktion scheint wie eine unnötige Komplikation für diese Art der Anwendung.

Die Suche nach alternativen Mitteln zu kompilieren und gefunden:

import py_compile
py_compile.compile("ProblemDemo.py")

Dies erzeugt eine pyc-Datei, die wie vorgesehen funktioniert. So lernte die Lektion ist, dass Import nicht eine robuste Art und Weise ist Python-Skripte zu kompilieren.

Andere Tipps

Das ist in der Tat eine schlechte Idee, diese Art von Code beim Import auszuführen, obwohl ich nicht sicher bin, warum es hängt - es, dass Importmechanismus etwas tut sein mag seltsam, die schlecht mit paramiko interagiert (vielleicht Thread Fragen?). Wie auch immer, ist die übliche Lösung ist die Funktionalität in eine Funktion zu implementieren:

def my_expensive_function(args):
    pass

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

Auf diese Weise nur die Modul Import wird nichts tun, aber das Skript ausgeführt wird, die Funktion mit den angegebenen Argumenten auf der Kommandozeile ausgeführt werden.

Das kann kein direkter Grund sein, warum, aber selten tun Sie jemals wollen „Funktionalität“ nach Import ausgeführt haben. Normalerweise sollten Sie definieren eine Klasse oder Funktion , die Sie dann wie folgt aufrufen:

import mymodule
mymodule.run()

Die „global“ Code, den Sie in einem Import laufen in der Regel sollten die Einfuhren, Variablendefinitionen, Funktion und Klassendefinitionen und dergleichen ...

begrenzt
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top