python - 当将stderr重定向到/dev/null并由multiprocessing.map_async调用时,子进程check_output抛出异常

标签 python subprocess python-multiprocessing

考虑这段代码:

#!/usr/bin/python                                                               

import os                                                                       
import multiprocessing                                                          
import subprocess                                                               

def search(name):                                                               
    devnull=open(os.devnull, 'w')                                               
    res = subprocess.check_output(                                              
            ['sleep', name]                                                     
            #, stderr=devnull # works fine when comment out                                                  
            )                                                                   

class Manager(object):                                                          
    def __init__(self):                                             
        self.pool = multiprocessing.Pool(4)                                     

    def clean(self):                                                            
        self.pool.close()                                                       
        self.pool.join()                                                        

    def fetch(self, names):                                                     
        res = self.pool.map_async(search, names)                                
        return res.get(10)                                                      


if __name__ ==  '__main__':                                                                                                              
    manager = Manager()                                                       
    manager.fetch([1, 2, 3])                                                    
    manager.clean()                                                             

如果我将 stderr 更改为指向临时文件或根本不更改 stderr,代码将正常执行,否则会出现以下异常:

Traceback (most recent call last):
  File "./z.py", line 71, in <module>
    manager.fetch([1, 2, 3])
  File "./z.py", line 64, in fetch
    return res.get(10)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 554, in get
    raise self._value
TypeError: execv() arg 2 must contain only strings

谁能解释一下为什么吗?

最佳答案

正如异常所暗示的,您的问题出在 execv() 中,它实际上由 subprocess.check_output 使用来运行参数。它告诉您参数数组必须是字符串。对于以下代码,您将收到相同的错误:

devnull=open(os.devnull, 'w') 
subprocess.check_output(["sleep", 1], stderr=devnull)

解决方案非常简单 - 将 manager.fetch([1, 2, 3]) 更改为 manager.fetch(["1", "2", "3"]).

关于python - 当将stderr重定向到/dev/null并由multiprocessing.map_async调用时,子进程check_output抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32010913/

相关文章:

python - 使用 r2pipe 进行多处理

python - 如何在pygame中添加一个具有我原始图像形状的白色表面?

python - 是否有另一种方法来关闭标准输入文件描述符(当前使用 <&- with shell=True)?

Python3 子进程通信示例

python - 在 python 调用 perl 脚本中使用 stdin 而不是文件

python - 用于计算特征值的多处理

python - 如何以 python 方式计算对象列表中所有计数的总数?

python - 如何跨线程发送无信号?

Python:将不同文件夹中的相同 .csv 文件(每个文件夹都有一个 .csv 文件)复制到一个文件夹中

python - 使用 Python 多处理加速从 Postgres 获取大表到 CSV