3

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

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

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

此代码挂在 ssh.connect() 语句中:

""" 问题演示.py
    从 paramiko 演示文件中删除。

    此代码在 shell 中有效,但在我尝试导入时挂起!
"""
从时间导入睡眠
导入操作系统

进口帕拉米科


sOutputFilename = "redacted.htm" #-- 有效负载文件

主机名 = "redacted.com"
#### -  警告!嵌入式密码!尽快删除。
sUsername = "已编辑"
sPassword = "已编辑"
sTargetDir = "已编辑"

#-- 获取主机密钥,如果我们知道的话。
主机键类型 = 无
主机键 = 无
主机键 = {}
尝试:
    host_keys = paramiko.util.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
除了 IOError:
    尝试:
        # 也试试 ~/ssh/,因为 windows 不能有一个名为 ~/.ssh/ 的文件夹
        host_keys = paramiko.util.load_host_keys(os.path.expanduser('~/ssh/known_hosts'))
    除了 IOError:
        print '*** 无法打开主机密钥文件'
        主机键 = {}

如果 host_keys.has_key(主机名):
    hostkeytype = host_keys[主机名].keys()[0]
    hostkey = host_keys[hostname][hostkeytype]
    print '使用类型为 %s 的主机密钥' % hostkeytype


ssh = paramiko.Transport((主机名, 22))

ssh.connect(username=sUsername, password=sPassword, hostkey=hostkey)

sftp = paramiko.SFTPClient.from_transport(ssh)

sftp.chdir(目标目录)

sftp.put (sOutputFilename, sOutputFilename)

ssh.close()

4

3 回答 3

5

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

def my_expensive_function(args):
    pass

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

这样,仅导入模块不会做任何事情,但运行脚本将在命令行使用给定参数执行函数。

于 2009-06-18T15:09:50.207 回答
1

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

import mymodule
mymodule.run()

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

于 2009-06-18T14:54:21.957 回答
0

除了奇怪之外,我只是使用 import 来编译代码。对于这种应用程序来说,将脚本变成函数似乎是不必要的复杂化。

搜索了另一种编译方式,发现:

导入 py_compile
py_compile.compile("ProblemDemo.py")

这会生成一个按预期工作的 pyc 文件。所以吸取的教训是 import 不是编译 python 脚本的可靠方法。

于 2009-06-18T15:29:12.617 回答