[英]Why does my Selenium code work in the Python Shell but not from a file?
[英]Why does this python code hang on import/compile but work in the shell?
我正在尝试使用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()
在导入时执行这种代码确实是一个坏主意,尽管我不确定为什么它会挂起-可能是导入机制做了一些奇怪的事情,与paramiko交互不良(可能是与线程有关的问题?)。 无论如何,通常的解决方案是将功能实现为功能:
def my_expensive_function(args):
pass
if __name__ == '__main__':
import sys
my_expensive_functions(sys.args)
这样,仅导入模块将不会执行任何操作,但是运行脚本将在命令行中使用给定参数执行函数。
这可能不是直接的原因,但是您很少希望在导入时执行“功能”。 通常,您应该定义一个类或函数 ,然后像这样调用:
import mymodule
mymodule.run()
您在导入中运行的“全局”代码通常应限于导入,变量定义,函数和类定义等。
除了怪异,我只是使用import来编译代码。 对于这种应用程序,将脚本转换为函数似乎是不必要的复杂性。
搜索替代的编译方法,发现:
import py_compile py_compile.compile("ProblemDemo.py")
这生成了一个可以正常工作的pyc文件。 因此,经验教训是导入不是编译python脚本的可靠方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.