我正在尝试使用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()
答案 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脚本的有效方法。