Domanda

Sto cercando di usare Python per sftp un file, e il codice funziona alla grande nella shell interattiva, anche incollandolo in una volta.

Quando provo a importare il file (solo per compilarlo), il codice si blocca senza eccezioni o errori evidenti.

Come ottengo la compilazione del codice o qualcuno ha un codice funzionante che realizza sftp con qualche altro metodo?

Questo codice si blocca proprio sull'istruzione ssh.connect ():

""" 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()

È stato utile?

Soluzione 3

Stranezze a parte, stavo solo usando l'importazione per compilare il codice. Trasformare lo script in una funzione sembra una complicazione inutile per questo tipo di applicazione.

Cercati mezzi alternativi per compilare e trovare:

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

Questo ha generato un file pyc che funziona come previsto. Quindi la lezione appresa è che l'importazione non è un modo affidabile per compilare script Python.

Altri suggerimenti

Questa è davvero una cattiva idea di eseguire questo tipo di codice al momento dell'importazione, anche se non sono sicuro del motivo per cui si blocca - potrebbe essere che il meccanismo di importazione fa qualcosa di strano che interagisce male con paramiko (forse problemi relativi al thread?). Comunque, la solita soluzione è implementare la funzionalità in una funzione:

def my_expensive_function(args):
    pass

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

In questo modo, l'importazione del modulo non farà nulla, ma l'esecuzione dello script eseguirà la funzione con gli argomenti forniti nella riga di comando.

Questo potrebbe non essere un motivo diretto per cui, ma raramente vuoi avere " funzionalità " eseguito al momento dell'importazione. Normalmente dovresti definire una classe o funzione che poi chiami in questo modo:

import mymodule
mymodule.run()

Il " globale " il codice che esegui in un'importazione in genere dovrebbe essere limitato a importazioni, definizioni di variabili, definizioni di funzioni e classi e simili ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top