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
它都无法工作。命令行参数必须是字符串,而不是整数。选中类型(名称)
。