Warum dieser Code Python hängen importieren / übersetzen, aber die Arbeit in der Schale?
-
06-07-2019 - |
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()
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