为什么这个python代码挂起导入/编译但在shell中工作?

时间:2009-06-18 14:45:20

标签: python shell compilation sftp

我正在尝试使用python来sftp一个文件,并且代码在交互式shell中运行良好 - 甚至可以一次性粘贴它。

当我尝试导入文件(只是为了编译它)时,代码会挂起,没有异常或明显的错误。

如何编译代码,或者某人是否有通过其他方法完成sftp的工作代码?

此代码在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()

3 个答案:

答案 0 :(得分:4)

在导入时执行这种代码确实是一个坏主意,虽然我不确定它为什么会挂起 - 可能是导入机制做了一些奇怪的事情,它与paramiko(与线程相关的问题可能?)相互影响很严重。无论如何,通常的解决方案是将功能实现到函数中:

def my_expensive_function(args):
    pass

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

这样,只是导入模块不会做任何事情,但运行脚本将在命令行执行带有给定参数的函数。

答案 1 :(得分:1)

这可能不是直接原因,但很少希望在导入时执行“功能”。通常你应该定义一个 class function ,你可以这样调用:

import mymodule
mymodule.run()

您在导入中运行的“全局”代码通常应限于导入,变量定义,函数和类定义等...

答案 2 :(得分:0)

除了怪异之外,我只是使用import来编译代码。将脚本转换为函数似乎是这种应用程序的不必要的复杂功能。

搜索其他编译方法并找到:

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

这生成了一个按预期工作的pyc文件。 所以吸取的教训是导入不是编译python脚本的有效方法。