背景
用ubuntu虚拟机写代码太恶心了,卡死,想迁移到Windows上进行开发
- 复制site-packages
- 直接运行代码
可能会出现的情况
app_name not found(版本问题,改回和Linux对应版本-老版本即可)
最新版本的sanic多了一个主进程和子进程的关系
所以你的app必须在全局的时候被赋值,不然子进程会找不到你的app
一些错误形式
if main == "__main__":
app = Sanic(name)
app.run()
g_app = None
if main == "__main__":
global g_app
g_app = Sanic(name)
g_app.run()
a.py
if main == "__main__":
b.run_server(name)
b.py
g_app = None
def run_server(name):
global g_app
g_app = Sanic(name)
g_app.run()
正确写法
app = Sanic(name)
if main == "__main__":
app.run()
a.py
g_app = b.get_app(name)
if main == "__main__":
g_app.run()
b.py
def get_app(name):
return Sanic(name)
有一个tools的包死活装不上,只能在linux用
应该是httptools,他在sanic源码中被调用了,但是报错了, 可能是我直接从Linux环境copy出来的sanic版本都是Ubuntu的。
- 我在新的环境中安装sanic,发现会自动给我下载一些必须的包,其中就包括:httptools等其他的包
- 于是我卸载了copy出来的那些包,并且重新下载了最新版本的sanic
- 问题得以解决
- 整个过程中反复下载sanic包,主要目的是:确保sanic自身与Linux版本一致,sanic所必须的包改为windows能够运行的包
import_module无法导入子模块
在web_driver.py中有如下代码
# 导包以运行一些装饰器
import_all(f'{app_name}.{MODULES_PACKAGE}')
导包前会先全部导一次包,里面使用了try_catch,其实这里就已经报错了,报错会输出到console上,自己去看就行了。
解决办法
一般都是环境版本的问题,跟着报错去看是哪个导包错误
-
某些包的版本不一致会导致文件结构、命名、不一致,首先对照原来Linux环境的内容,看看是不是因为版本不兼容(名字,位置修改),导致import失败
例如(只是打个比方,都是瞎编的)
random的1.0版本里面有个old_random函数,到了版本3.0这个函数改名成了random函数
panda里面有个文件a.py代码如下
from random import old_random
如果你的random是3.0的话,你执行
import panda.a
就会报错
此时可以考虑-
pip uninstall panda``````pip install panda
,更新panda包 -
直接修改random的源代码,将old_random函数重命名为random函数,或者copy一份old_random改为random
-
注册蓝图显示重复的name
我明明Linux不会重复啊!为啥会重复,
根据报错定位到绑定蓝图的地方,发现我们一般name是默认的,sanic的默认name格式为:package.func_name,绑定的时候显式指明即可:name=package.file_name.func_name
版本问题,回退sanic版本即可
运行成功?高兴得太早啦!
经过重重磨难之后终于运行成功了
还记得这个代码吗:
# 导包以运行一些装饰器
import_all(f'{app_name}.{MODULES_PACKAGE}')
在Linux的时候我发现它只会跑一次,然后再windows上面他会跑两次,并且跑两次没有任何报错,但是就是无法访问(可能是另外一个问题,下文会提到,但是作者当时没有意识到)
还记得我之前是直接卸载重装的sanic么,版本不一致了
最新版本的sanic多了一个主进程和子进程的关系,贼恶心,
继续卸载重装对应版本的sanic=21.3.4
然后可能会碰到之前碰到过的问题,照常处理即可
运行成功,还是无法访问
我绑定的ip是0.0.0.0, 改成本机ipconfig对应的ip地址即可(原因不明)
运行成功,但是还是无法访问swagger,可以正常请求接口了
找啊找,继续找swagger在哪绑定的,发现swagger是静态资源
最后发现在绑定swagger.index.html的时候路径错了,这里是Linux的路径格式,windows路径应该是\\
并且请求的时候也会报错,xxx.js 404 not_found
静态页面地址错了
改完这个index.html后,去index.html文件中,把路径相关的都改成\\后,