考虑这段代码:
#!/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/