我有一个使用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