与gevent 1.2.2一起使用时,Popen上的子进程失败

2024-04-23 07:36:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用websockets的flask应用程序。对于websockets,我安装了gevent 1.2.2。在应用程序中,我尝试调用一个子进程:

def runsub(exec,filePath,input):
    prc = Popen([exec,filePath],stdin=PIPE,stdout=PIPE,stderr=PIPE)
    return prc.communicate(input)

我得到了一个错误:

^{pr2}$

当我直接调用相同的函数时,运行良好,即不使用烧瓶或gevent:

>>> include utils
>>> utils.runsub('someapp','somefile','someinput')

奇怪的是:如果我卸载gevent并安装eventlet(对于websockets),一切都很好(没有对代码进行任何更改)。 不幸的是,我不能使用eventlet,因为客户机要求使用gevent(无论出于什么原因)。在

有人遇到过这个错误吗?或者知道怎么绕过它吗?在

我在macosx10.11.6上运行python3.6。在

更新:MacOSX10.12.6也发生了同样的事情

更新2:以下是@Hannu提供的一个可能的解决方法:github.com/celery/celery/issues/3230在

更新3:我发现,如果我使用新的烧瓶方式运行应用程序,一切似乎都能正常工作:

FLASK_APP=myapp.py flask run --port 8001 --host 0.0.0.0

请注意,“旧”的运行方式是简单地调用python myapp.py


Tags: 应用程序flaskinputwebsockets烧瓶错误geventutils