2009-06-18 7 views
1

Ich versuche, Python zu verwenden, um eine Datei sftp, und der Code funktioniert gut in der interaktiven Shell - sogar Einfügen in alle gleichzeitig.Warum hängt dieser Python-Code beim Import/Kompilieren, aber in der Shell?

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

Wie bekomme ich den Code zu kompilieren, oder hat jemand Arbeitscode, der sftp durch eine andere Methode 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() 

+0

Duplizieren: http://stackoverflow.com/questions/443387/why-does-paramiko-hang-if-you-use-it-while-loading-a-module – JimB

+0

Danke. Das habe ich bei meinen Recherchen nicht verstanden. –

Antwort

0

Seltsamerweise beiseite, ich war nur mit importieren, um den Code zu kompilieren. Das Drehen des Skripts in eine Funktion scheint für diese Art von Anwendung eine unnötige Komplikation zu sein.

für alternative Mittel gesucht zu kompilieren und gefunden:

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

Dies erzeugt eine pyc-Datei, die wie vorgesehen funktioniert. Die Lektion, die gelernt wurde, ist also, dass Import keine robuste Methode ist, Python-Skripte zu kompilieren.

+0

aber warum sollten Sie Ihr Python-Skript überhaupt erst kompilieren? –

+0

Es erleichtert die Ausführung von Windows Explorer und Windows Taskplaner. –

+0

Ich glaube, die richtige Lektion, die gelernt wurde, besteht nicht darin, während eines Imports langen oder komplexen Code auszuführen. Vielleicht ist es "legal", aber auf vielen Ebenen sicherlich nicht weise. – gahooa

1

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

import mymodule 
mymodule.run() 

Die „global“ Code, den Sie in einem Import laufen in der Regel für die Einfuhr, Variablendefinitionen, Funktion und Klasse beschränkt sein sollte Definitionen und dergleichen ...

+0

Wie würde eine solche Datei vom Betriebssystem ausgeführt werden? Dies ist keine Bibliothek, ich habe es nur importiert, um die pyc-Datei generiert zu bekommen. –

4

Das ist in der Tat eine schlechte Idee, diese Art von Code zum Zeitpunkt des Imports auszuführen, obwohl ich nicht sicher bin, warum es hängt - es könnte sein, dass Import-Mechanismus etwas seltsames tut, das schlecht mit Paramiko interagiert (Thread-bezogene Probleme vielleicht?). 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 das Modul tut nichts importieren, aber das Skript ausgeführt wird, die Funktion mit den angegebenen Argumenten auf der Kommandozeile auszuführen.

+0

+1 - Thread verwandt;) – JimB

+0

+1 Siehe detaillierte Analyse [hier] (https://stackoverflow.com/a/46354248/5896591). Ich stimme zu, dass das Minimieren von Code (insbesondere Warten), die zu "Import" -Zeiten ausgeführt werden, helfen wird, das Problem zu vermeiden. –