- python version: 3.10
- Sanic-Cors version: 2.2.0
- sanic version: 24.6.0
OS: Win 11
首先我尝试直接运行了api.py,没有发生任何错误,但是当我再尝试运行main.py的时候,发生了:
PS E:\project>python main.py Main 2024-08-15 21:58:44 +0800 INFO: Sanic v24.6.0 Main 2024-08-15 21:58:44 +0800 INFO: Goin' Fast @ http://127.0.0.1:5050 Main 2024-08-15 21:58:44 +0800 INFO: app: ip Main 2024-08-15 21:58:44 +0800 INFO: mode: production, single worker Main 2024-08-15 21:58:44 +0800 INFO: server: sanic, HTTP/1.1 Main 2024-08-15 21:58:44 +0800 INFO: python: 3.12.4 Main 2024-08-15 21:58:44 +0800 INFO: platform: Windows-11-10.0.22631-SP0 Main 2024-08-15 21:58:44 +0800 INFO: packages: sanic-routing==23.12.0 Traceback (most recent call last): File "<string>", line 1, in <module> File "xxx\Python\Python312\Lib\multiprocessing\spawn.py", line 122, in spawn_main exitcode = _main(fd, parent_sentinel) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "xxx\Python\Python312\Lib\multiprocessing\spawn.py", line 131, in _main prepare(preparation_data) File "xxx\Python\Python312\Lib\multiprocessing\spawn.py", line 246, in prepare _fixup_main_from_path(data['init_main_from_path']) File "xxx \Python\Python312\Lib\multiprocessing\spawn.py", line 297, in _fixup_main_from_path main_content = runpy.run_path(main_path, ^^^^^^^^^^^^^^^^^^^^^^^^^ File "<frozen runpy>", line 286, in run_path File "<frozen runpy>", line 98, in _run_module_code File "<frozen runpy>", line 88, in _run_code File "xxx\test\main.py", line 3, in <module> api.start_server() File "xxx\test\api.py", line 16, in start_server app.run(host="127.0.0.1", port=5050) File "xxx\Python\Python312\Lib\site-packages\sanic\mixins\startup.py", line 291, in run serve(primary=self) # type: ignore ^^^^^^^^^^^^^^^^^^^ File "xxx\Python\Python312\Lib\site-packages\sanic\mixins\startup.py", line 1003, in serve cls._set_startup_method() File "xxx\Python\Python312\Lib\site-packages\sanic\mixins\startup.py", line 932, in _set_startup_method set_start_method(method, force=cls.test_mode) File "xxx\Python\Python312\Lib\multiprocessing\context.py", line 247, in set_start_method raise RuntimeError('context has already been set') RuntimeError: context has already been set
这是第一个python文件 (api.py):
# api.py from sanic import Sanic, json from sanic_cors import CORS app = Sanic("ip") CORS(app) @app.route("/get_proxy") async def ip_api(request): ip = "XXXXXX" return json({"ip": ip}) def start_server(): app.run(host="127.0.0.1", port=5050) if __name__ == '__main__': start_server()
这是第二个python文件 (main.py):
# main.py import api api.start_server()
感谢您提供的帮助。
我原本怀疑时主模块检查因为某些原因自己运行了,于是删除了那段代码,但并没有任何效果。
感谢各位,本贴已于 Stackoverflow 上解决,这是解决方法,希望能帮助到更多朋友。
This has something to do with the fact that Sanic has to start in main, but the routes can be defined anywhere else.
Sanic 必须在__main__中启动,因为Sanic需要在其中做一些事情,但是相关路由可以定义在任何地方。
This works:
这样做就可以正常运行了:
Or try this:
或者试试这样做: