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

为什么这个python代码挂起在导入/编译上,但在shell中工作?,python,shell,compilation,sftp,Python,Shell,Compilation,Sftp,我正在尝试使用python来生成一个文件,而代码在交互式shell中工作得非常好——甚至可以一次粘贴到所有文件中 当我尝试导入文件(只是为了编译它)时,代码挂起,没有异常或明显错误 我该如何编译代码,或者是否有人拥有通过其他方法实现sftp的工作代码 此代码挂起在ssh.connect()语句上: """ ProblemDemo.py Chopped down from the paramiko demo file. This code works in the shell b

我正在尝试使用python来生成一个文件,而代码在交互式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() “”“ProblemDemo.py 从paramiko演示文件中截取。 此代码在shell中工作,但在尝试导入时挂起! """ 从时间上导入睡眠 导入操作系统 进口帕拉米科 sOutputFilename=“redact.htm”#——有效负载文件 hostname=“redact.com” ####--警告!嵌入式密码!尽快移除。 sUsername=“已编辑” sPassword=“已修订” sTargetDir=“已编辑” #--获取主机密钥,如果我们知道的话。 hostkeytype=None 主机密钥=无 主机密钥={} 尝试: 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外: 打印“***无法打开主机密钥文件” 主机密钥={} 如果主机具有密钥(主机名): hostkeytype=host_keys[hostname].keys()[0] hostkey=主机密钥[主机名][主机密钥类型] 使用%s“%hostkeytype”类型的主机密钥打印 ssh=paramiko.Transport((主机名,22)) connect(用户名=sUsername,密码=sPassword,主机密钥=hostkey) sftp=paramiko.SFTPClient.from_传输(ssh) sftp.chdir(sTargetDir) sftp.put(sOutputFilename,sOutputFilename) ssh.close()
这可能不是导入时执行“功能”的直接原因,但您很少希望在导入时执行“功能”。通常,您应该定义一个类或函数,然后按如下方式调用:

import mymodule
mymodule.run()

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

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

def my_expensive_function(args):
    pass

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

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

奇怪的是,我只是使用import编译代码。对于此类应用程序来说,将脚本转换为函数似乎是一个不必要的复杂问题

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

import py_compile py_compile.compile("ProblemDemo.py") 导入py_编译 py_compile.compile(“ProblemDemo.py”) 这将生成一个pyc文件,该文件按预期工作。
因此,我们得到的教训是,导入并不是编译python脚本的可靠方法。

如何从操作系统运行这样的文件?这不是一个库,我只是将其导入以生成pyc文件。但是,为什么首先要编译python脚本呢?它使从windows资源管理器和windows任务计划程序运行更容易。我认为正确的经验教训是,在导入过程中不要运行冗长或复杂的代码。也许它是“合法的”,但在许多层面上肯定不是明智的。这是一个教训,但这里真正的教训是它的推论:不要使用导入来编译临时脚本。这个问题的目的是成功地完成。像我这样的noob,被告知使用import来获取编译后的文件——它在几十个脚本上工作——但这不是一个好建议。我想你误解了这里发生的事情。Python不是一种编译语言。导入模块时不应运行重要代码;改为用函数包装。重复:谢谢。在我的搜索中,我没有发现这一点。我同意最小化在
import
时间执行的代码(尤其是等待)将有助于避免问题。