2012-08-05 91 views
1

我不明白为什么下面的代码挂起。当我从控制台运行它时,一切都很好,但是当我尝试通过浏览器运行它时,页面会挂起。 我正在使用Python 2.7.2。线程中的子进程。线程挂起

class MyThread(threading.Thread): 
    def __init__(self): 
     self.stdout = None 
     self.stderr = None 
     threading.Thread.__init__(self, name="snapshot",) 

    def run(self): 
     p = subprocess.Popen(["pwd"], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=None) 
     p.communicate() 

myThread = MyThread() 
myThread.start() 
myThread.join() 

更新 我与Apache上运行的Python的CGI。运行的系统是Gentoo 2.1。

我认为问题出在Apache上。不知何故,它阻止了新线程,但我不确定。

+0

有一个语法错误 - 在类定义之后没有“:”。 – 2012-08-05 14:25:46

+0

你是什么意思“通过浏览器运行”?如果你使用Python web框架,你应该指定哪一个,并且你是直接运行它还是运行在apache/nginx/etc之后。 – stderr 2012-08-05 14:52:14

回答

0

尝试使用shell=False来运行此操作。

我怀疑当你在你的web框架中运行这个代码时,你并没有真的有一个shell,这是造成问题的原因。

或者,您不能重复使用您的Web服务器进程中的stdoutstdin,并通过尝试使用subprocess.PIPE来引起事件挂起。

我想你实际上并不需要运行pwd和你仅仅使用它作为一个例子,但如果你真的只需要pwd这是一个不必要的复杂的方式来做到这一点。只需将其替换为os.curdir属性即可。

+0

“pwd”仅用于测试目的。我尝试用'Shell = False'运行'Popen',但没有成功。我也尝试将一个文件对象传递给'stdout'和'stdin',但该文件只是在没有'pwd'命令输出的情况下创建的。 – bozhidarc 2012-08-06 06:48:24