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

时间:2017-08-25 19:42:40

标签: python flask subprocess gevent

我有一个使用websockets的烧瓶应用程序。对于我安装gevent 1.2.2的websockets。在应用程序中我试图调用子进程:

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

我收到了这个错误:

Traceback (most recent call last):
  File "/private/var/apps/utils.py", line 1956, in runsub
    prc = Popen([exec,filePath],stdin=PIPE,stdout=PIPE,stderr=PIPE)
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/subprocess.py", line 707, in __init__
    restore_signals, start_new_session)
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/subprocess.py", line 1254, in _execute_child
    self.pid = _posixsubprocess.fork_exec(
AttributeError: 'NoneType' object has no attribute 'fork_exec'

当我直接调用相同的函数时,它运行正常,即没有烧瓶或gevent:

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

这是奇怪的部分:如果我卸载gevent并安装eventlet(对于websockets),一切正常(没有对代码进行任何更改)。 不幸的是我无法使用eventlet,因为客户端需要使用gevent(无论出于何种原因)。

有没有人遇到过这个错误?或者任何想法如何绕过它?

在Mac OS X 10.11.6上运行python 3.6。

更新:在Mac OS X 10.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

0 个答案:

没有答案