Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将stderr重定向到/dev/null并由multiprocessing.map\u async调用时,子进程检查\u输出引发异常_Python_Subprocess_Python Multiprocessing - Fatal编程技术网

Python 将stderr重定向到/dev/null并由multiprocessing.map\u async调用时,子进程检查\u输出引发异常

Python 将stderr重定向到/dev/null并由multiprocessing.map\u async调用时,子进程检查\u输出引发异常,python,subprocess,python-multiprocessing,Python,Subprocess,Python Multiprocessing,考虑以下代码: #!/usr/bin/python import os import 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
回溯(最近一次呼叫最后一次):
文件“/z.py”,第71行,在
manager.fetch([1,2,3])
文件“/z.py”,第64行,在fetch中
返回res.get(10)
get中的文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py”,第554行
提升自我价值
TypeError:execv()arg 2只能包含字符串

有人能解释一下原因吗?

正如异常所建议的,您的问题在
execv()
中,它实际上由
子流程使用。请检查\u output
以运行参数。它告诉您参数数组必须是字符串。对于以下代码,您将得到相同的错误:

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

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

至于异常,在我的操作系统上,无论是否有文件输出,都会发生。您使用什么操作系统?无论是否存在
stderr
它都无法工作。命令行参数必须是字符串,而不是整数。选中
类型(名称)