2010-02-28 17 views
3

webpy 및 fastcgi와 함께 lighttpd 서버를 설치했습니다. wenpy 앱에 액세스 할 때마다 파이썬 스크립트를 실행하려고합니다. 스크립트를 실행하기 위해 일반적인 파이썬 코드를 제공 할지라도 아무 일도하지 않는 것처럼 보입니다. 그래서이 스크립트를 실행할 수 있기를 원하는 어떤 아이디어라도 도움이 될 것입니다.webpy에서 python 스크립트를 실행하십시오.

#!/usr/bin/env python 

import web, os 

urls = (
    '/(.*)', 'hello' 
) 
app = web.application(urls, globals()) 

class hello: 
    def GET(self, name): 
     os.system("python /srv/http/script/script.py") 
     if not name: 
      name = 'world' 
     return "Running" 

web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func, addr) 
if __name__ == "__main__": 
    app.run() 

답변

3

당신의 방법을 가정하면 내 최고 관심사는 오류가 발생하고 문제를 설명하는 표준 출력을 받고되지 않는다는 것이다 실행 (os.system을 반환 값, 예를 들어, 종료 코드를 얻을 것이다). 파이썬 문서는 하위 프로세스로 대체하는 것이 좋습니다, 나는이 일을 좋아한다 :

from subprocess import Popen, PIPE 
proc = Popen('ls', shell=True, stdout=PIPE) 
proc.wait() 
proc.communicate() 
+0

파이프에서 돌아 오면 모두 -1이고 프로그램이 실행되지 않습니다. – Recursion

+0

명령을 인쇄하여 직접 실행 해 보았습니까? 껍질은 어때? -1 일부 수준에서 오류를 나타냅니다. – Aea

+0

정상적으로 실행할 때 쉘에서 정상적으로 작동합니다. 위의 프로그램뿐만 아니라 실행하려고하는 스크립트 모두 잘 작동합니다. 난 서버에 액세스하는 동안 그것을 실행하려고하면 오류가 발생합니다. – Recursion

0

내가 결국 webpy 응용 프로그램의 목적은 좋은 작품으로 스크립트를 호출하지만, 외부에서 그것을 실행하는 것은 단순히 일을 결코 결정 없다는 것을 발견했다.

0

아마 작동하지 않는 이유는 lighttpd가 데몬이고 데몬이 stdin/stdout/stderr 파일 설명자를 닫는 것일 수 있습니다. 실행하는 프로그램은 해당 설명자가 열려있는 터미널이 필요하지만 호출자로부터 상속되어 닫힙니다. 따라서 외부 프로그램을 호출 할 때는 직접 제공해야합니다. 예를 들어 :

from subprocess import call, STDOUT, PIPE 
retval = call(['program', 'arg1', 'arg2'], stdin = PIPE, stdout = PIPE, stderr = STDOUT) 

는 조작이에 결과 무엇을보고 무엇을 찾고 있는지 Python docs

0

의 설명과 예제 참조 : Popen 명령 후

print proc.stdout.read()

관련 문제