IOError: [Errno 32] Broken pipe-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

IOError: [Errno 32] Broken pipe

2016-06-17 16:08:33 5172 1
# -*- coding: utf-8 -*-
#!/usr/bin/python26

from SimpleHTTPServer import SimpleHTTPRequestHandler  
from BaseHTTPServer import BaseHTTPRequestHandler  
from BaseHTTPServer import HTTPServer  
import SocketServer
import cgi
import os
import logging
import thread


class MyHTTPRequestHandler( BaseHTTPRequestHandler ):  

    def do_GET( self ):  
        pass

    def do_POST(self):

        # 创建线程执行命令    
        thread.start_new_thread(self.callscript, ('cd /home/www/man-sphinx/docs.500.com/html && /usr/bin/sphinx-build -c ./  ./  /home/www/html/docs.500.com/html/',))

        form = cgi.FieldStorage(  # cgi.FieldStorage实例效果类似一个字典,包含键-值和len等内置函数
            fp=self.rfile,
            headers=self.headers,
            environ={'REQUEST_METHOD':'POST',
                     'CONTENT_TYPE':self.headers['Content-Type'],
                     })

        self.send_response(200)
        self.end_headers()
        self.wfile.write('Client: %s\n' % str(self.client_address))
        # self.wfile.write('User-agent: %s\n' % str(self.headers['user-agent']))
        # self.wfile.write('Path: %s\n' % self.path)

        params = {}
        for field in form.keys():
            params[field] = form[field].value

        filepath = params.get('f')
        data = params.get('d')
        code = params.get('c')
        user = params.get('u')

        try:
            result = self.filesave(filepath, data, code, user)
        except Exception, e:
            result = 'Error in filesave:%s' % e
        finally:
            self.wfile.write(result)

        # self.callscript('cd /home/www/man-sphinx/docs.500.com/html && /usr/bin/sphinx-build -c ./  ./  /home/www/html/docs.500.com/html/')

    def filesave(self, filepath, data, code, user):

        if (filepath and data and code and user) is None:
            return 'Params uncomplete!\n'

        path = '/'.join(filepath.split('/')[:-1])
        name = filepath.split('/')[-1]
        if not os.path.exists(path):
            os.makedirs(path)
        f = open(filepath, 'w')
        f.write(data.decode(code).encode('utf-8'))
        f.close()
        self.log(filepath, user)
        return 'Filesaved in %s' % filepath

    def callscript(self, command):
        try:
            os.popen(command)  # 报错
        except Exception,e:
            print 'Error in CallScript:%s' % e


    def log(self, filepath, user):
        pass

    def do_HEAD( self ):  
        pass  


if __name__ == '__main__':  
    port = 28080  

    handler = SimpleHTTPRequestHandler  

    #httpd = SocketServer.TCPServer(("", port ), handler )  
    httpd = HTTPServer(('', port ), MyHTTPRequestHandler)  

    print "Server is running at port", port  
    httpd.serve_forever() 
这是一个简单的文件存储服务器,文件存储工作正常,但是我希望接受post请求的时候开启一个线程去刷新文件目录,问题是在callscript函数里使用os.popen()会报题示的错误,如果改成os.system()就不会. 详细错误:

全选复制放进笔记# Sphinx version: 1.1.3
# Python version: 2.6.5
# Docutils version: 0.11 release
# Jinja2 version: 2.7.1
Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/Sphinx-1.1.3-py2.6.egg/sphinx/cmdline.py", line 188, in main
    warningiserror, tags)
  File "/usr/lib/python2.6/site-packages/Sphinx-1.1.3-py2.6.egg/sphinx/application.py", line 94, in __init__
    self.info(bold('Running Sphinx v%s' % sphinx.__version__))
  File "/usr/lib/python2.6/site-packages/Sphinx-1.1.3-py2.6.egg/sphinx/application.py", line 238, in info
    self._status.flush()

IOError: [Errno 32] Broken pipe

取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:42:59

    你要知道 popen 是干什么的。它会把子进程的标准输出通过管道连接到父进程。所以你要在父进程里读取该管道,而如果直接关闭的话,子进程写管道的时候就会得到「Broken pipe」的错误了。如果不读取管道的话,子进程向管道中写入超过管道缓冲区的内容的时候会被阻塞。

    os.popen 函数返回一个 file-like 对象。你直接 .read() 可以读取管道中所有的数据。

    如果你只是不想子进程显示信息的话,可以把它的标准输出重定向到 /dev/null。使用 Python 3.3+ 以及 subprocess.Popen 的话,指定 stdout=subprocess.DEVNULL 即可。

    0 0
相关问答

1

回答

如何解决Spring Bean的循环依赖?

2022-04-01 02:41:19 169浏览量 回答数 1

2

回答

ERROR 2013 (HY000) at line 6

2020-08-18 17:35:13 513浏览量 回答数 2

1

回答

JavaScript NetworkError: 417 Expectation?报错

2020-06-22 18:10:07 252浏览量 回答数 1

1

回答

win2003server 32bit

2018-07-13 16:49:02 1210浏览量 回答数 1

1

回答

新建发信地址提示Token error?什么鬼??

2017-08-26 14:55:43 4032浏览量 回答数 1

1

回答

CDN添加域名出现Token error

2016-12-30 20:45:48 2944浏览量 回答数 1

2

回答

云主机,win2008 r2 64 sp1 ,只有.net3.5 需要安装4.5出现错误,请问怎么解决?

2016-11-30 22:13:39 4380浏览量 回答数 2

5

回答

请教大家 ,win2008 R2 sp1 安装.net4.5 错误,如何解决?

2016-11-30 22:44:11 8189浏览量 回答数 5

3

回答

Linux下的broken pipe问题

2015-11-27 16:14:39 6552浏览量 回答数 3

5

回答

我擦香港线路真的很渣吗ECS香港线路很慢?求网站试试速度

2015-08-08 15:33:12 4794浏览量 回答数 5
+关注
0
文章
14879
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载