记sanic的Linux环境迁移到windows过程

背景

用ubuntu虚拟机写代码太恶心了,卡死,想迁移到Windows上进行开发

  1. 复制site-packages
  2. 直接运行代码

可能会出现的情况

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的。

  1. 我在新的环境中安装sanic,发现会自动给我下载一些必须的包,其中就包括:httptools等其他的包
  2. 于是我卸载了copy出来的那些包,并且重新下载了最新版本的sanic
  3. 问题得以解决
  4. 整个过程中反复下载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文件中,把路径相关的都改成\\后,

终于成功访问页面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值