![](/img/trans.png)
[英]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.