Pourquoi ce code python se bloque-t-il sur l'importation / la compilation mais fonctionne-t-il dans le shell?

StackOverflow https://stackoverflow.com/questions/1013064

Question

J'essaie d'utiliser python pour sftp un fichier, et le code fonctionne très bien dans le shell interactif - même en le collant d'un coup.

Lorsque j'essaie d'importer le fichier (juste pour le compiler), le code se bloque sans exception ni erreur évidente.

Comment puis-je obtenir le code à compiler, ou quelqu'un a-t-il un code fonctionnel qui accomplit sftp par une autre méthode?

Ce code est bloqué directement à l'instruction 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()

Était-ce utile?

La solution 3

La bizarrerie mise à part, j’utilisais simplement l’import pour compiler le code. Transformer le script en une fonction semble être une complication inutile pour ce type d’application.

Vous avez recherché d'autres moyens de compiler et trouvé:

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

Ceci a généré un fichier pyc qui fonctionne comme prévu. La leçon à retenir est que l’importation n’est pas un moyen efficace de compiler des scripts python.

Autres conseils

C’est effectivement une mauvaise idée d’exécuter ce genre de code au moment de l’importation, bien que je ne sois pas sûr de la raison - c’est peut-être que le mécanisme d’import fait quelque chose d’étrange qui interagit mal avec paramiko (des problèmes liés aux threads, peut-être?). Dans tous les cas, la solution habituelle consiste à implémenter la fonctionnalité dans une fonction:

def my_expensive_function(args):
    pass

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

De cette façon, importer le module ne fera rien, mais exécuter le script exécutera la fonction avec les arguments donnés en ligne de commande.

Ce n'est peut-être pas une raison directe, mais vous avez rarement envie de disposer de "fonctionnalité". exécuté à l'importation. Normalement, vous devez définir une classe ou une fonction que vous appelez ensuite comme ceci:

import mymodule
mymodule.run()

Le " global " Le code que vous exécutez dans une importation doit généralement être limité aux importations, définitions de variable, définitions de fonction et de classe, etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top