2009-06-18 1 views
1

저는 파이썬을 사용하여 파일을 sftp로 만들려고합니다.이 코드는 대화 형 셸에서 훌륭하게 작동합니다. 심지어 모든 것을 한꺼번에 붙여 넣을 수도 있습니다.왜이 Python 코드가 가져 오기/컴파일시 정지되지만 쉘에서 작동합니까?

파일을 가져 오려고하면 (컴파일하기 위해) 코드가 예외 나 명백한 오류로 중단됩니다.

코드를 컴파일하려면 어떻게해야합니까? 아니면 누군가 다른 방법으로 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

중복 : http://stackoverflow.com/questions/443387/why-does-paramiko-hang-if-you-use-it-while-loading-a-module – JimB

+0

감사. 나는 내 수색에서 그걸 잡지 못했다. –

답변

0

제쳐두고, 나는 코드를 컴파일하기 위해 가져 오기를 사용하고있었습니다. 스크립트를 함수로 바꾸는 것은 이런 종류의 애플리케이션에 대해 불필요한 복잡성처럼 보입니다.

컴파일하는 대체 수단에 대한 검색 및 발견
 
import py_compile 
py_compile.compile("ProblemDemo.py") 

의도 한대로 작동의 pyc 파일을 생성. 그래서 가져온 것이 파이썬 스크립트를 컴파일하는 강력한 방법이 아니라는 교훈을 얻었습니다.

+0

하지만 왜 처음부터 파이썬 스크립트를 컴파일하고 싶습니까? –

+0

Windows 탐색기 및 Windows 작업 스케줄러에서 실행하기가 더 쉽습니다. –

+0

나는 배운 올바른 교훈은 가져 오는 동안 길거나 복잡한 코드를 실행하지 않는다고 생각한다. 아마도 그것은 "합법적"이지만 수많은 수준에서 현명하지 않을 것입니다. – gahooa

1

이 거의 이제까지을하지 않는다 가져올 때 실행 "기능을"갖고 싶어 왜하지만 직접적인 이유가 될 수 없습니다. 일반적으로 당신은 당신이 다음과 같이 부르는 클래스 또는 기능을 정의해야합니다 :

import mymodule 
mymodule.run() 

당신은 일반적으로 수입, 변수 정의, 기능과 클래스에 제한되어야 가져 오기 실행 "글로벌"코드 정의 등 ...

+0

OS에서 이러한 파일을 어떻게 실행합니까? 이것은 라이브러리가 아니며 방금 가져온 pyc 파일을 가져 오기 위해 가져 왔습니다. –

4

왜 내가 왜 멈출 지 모르겠지만 가져 오기시 이러한 종류의 코드를 실행하는 것은 좋지 않습니다. 가져 오기 메커니즘이 paramiko와 상호 작용하는 이상한 작업을 수행 할 수 있습니다. (스레드 관련된 문제는 아마도?). 어쨌든, 일반적인 솔루션은 기능에 기능을 구현하는 것입니다

def my_expensive_function(args): 
    pass 

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

이 방법은, 그냥 모듈은 아무것도하지 않습니다 수입하지만, 명령 줄에 지정된 인수와 기능을 실행할 스크립트를 실행.

+0

+1 - 스레드 관련;) – JimB

+0

+1 자세한 분석 [여기] (https://stackoverflow.com/a/46354248/5896591)을 참조하십시오. 'import '시간에 실행되는 코드 (특히 대기)를 최소화하는 것이 문제를 피하는 데 도움이된다는 것에 동의합니다. –

관련 문제