Ubuntu 中通过源码安装 Python3.x 环境

最近在个人前后端分离项目时候, 后端接口程序 fastapi, 在部署的时候, 需要 Pyhton3.8 以上的环境, 但 ubuntu 默认的是 2.7 于是想通过源码安装的方式进行环境搭建.

下载

官网下载二进制源码安装包: https://www.python.org/downloads/source/

wegt https://www.python.org/ftp/python/3.8.18/Pyhton-3.8.18tgz

当然也可以自己手动去官网下载, 反正最终是源码的压缩包即可.

假设下载好的安装包为: Python-3.8.18.tgz

安装

解压安装包

tar zxvf Python-3.8.18.tgz

创建安装目录

mkdir /usr/local/python3.8

指定安装目录

cd Python-3.8.18
./configure --prefix=/usr/local/pyhton3.8

加速构建过程

-- 我的服务器是2核, 充分利用, 如果不知道可通过 nproc 查看
make -j 2

编码源码

-- 可勿用默认的 make install 以免覆盖一些默认文件
sudo make altinstall

设置软链接

ubuntu 默认是有 python2.7 环境的, 直接通过覆盖的方式将其换成 3.8即可

ln -sf /usr/local/python3.8/bin/pyhton3.8 /usr/bin/pyhton
ln -sf /usr/local/python3.8/bin/pip3.8 /usr/bin/pip

验证

python -V

Python 3.8.18

pip -V

pip 20.2.1 from /home/youge/venv/fastapi/lib/python3.8/site-packages/pip (python 3.8)

创建虚拟环境

因为要通过 uvicorn 服务器来运行后端程序, 隐藏需要在虚拟环境中来执行, 这里用 python 内置的即可

可以创建一个名为 venv 的目录来存放所有虚拟环境.

mkdir venv

进入该目录下, 通过一行命令即可创建虚拟环境, 例如这里要建的环境名为 fastapi

python -m venv fastapi

然后当前目录就会出现一个名为 fastapi 的目录, 通过 source 命令启动其 bin 下的 activate 即可.

source bin/activate

这时候就进入了虚拟环境, 准备启动项目了.

项目启动

进入项目根目录下, 例如项目启动文件是 main.py, 可以直接通过 uvicorn 服务器启动, 然后将通过 nohup其挂到后台执行即可.

nohup uvicorn main:app --host 0.0.0.0 --port 8000 --workers 2 > /dev/null 2>&1 &

这里的 main 表示项目启动文件是 main.py, 这里 app 表示项目实例, 即 mian.py 里面有一行是,

app = FastAPI()

然后指定主机名 0.0.0.0 表示监听所有可用网络接口, 端口为 8000, 并启动两个进程.

nohup 表示将此任务挂到后台运行, > /dev/null 2>&1 & 表示不存储运行日志, 就个人小项目看啥日志, 直接改代码不就行啦.

可通过 lsof -i:xxx 查看端口占用情况:

(fastapi) youge@VM-12-5-ubuntu:~/venv/test$ lsof -i:8000

COMMAND  PID  USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
uvicorn 6933 youge    3u  IPv4 679082892      0t0  TCP *:8000 (LISTEN)
python  6940 youge    3u  IPv4 679082892      0t0  TCP *:8000 (LISTEN)
python  6941 youge    3u  IPv4 679082892      0t0  TCP *:8000 (LISTEN)

(fastapi) youge@VM-12-5-ubuntu:~/venv/test$ 

可以看到确实有了 3个进程在监听 8000 端口. 后续要更新的话需要先停掉进程PID.

kill -9 6933

补充

项目目录设计

main.py

app

  • 模块01

    • __ init __.py
    • views.py 接口逻辑
  • 模块02

    • __ init __.py
    • views.py 接口逻辑

core

  • __ init __ .py
  • database.py 封装数据库实例的, 输出 db 实例给接口 import, 然后执行 db.execute (原生sql)
  • oauth.py 封装登录认证的, 即 JWT 认证
  • xxx sdk.py 类似一些图片上传 oss 等对接外部服务的封装

Tool

  • gen_hashed_valu.py

  • ... 类似工具性, 测试啥的东西

最后可通过项目的 main.py 可以看看

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import uvicorn 

from app.admin  import user
from app.goods import goods
from app.index import index
from app.image import image
from app.notice import notice



app = FastAPI(
  title="宇宙通-接口文档",
  version='1.0.0',
  docs_url='/docs'
)

# 演示接口用 
# @app.get('/api/docs')
# def index1():
#   return { 'msg': '欢迎回家!'}


# 路由分发, 类似 flask 里面的 blueprint
app.include_router(user, prefix='/api/user', tags=['用户模块'])
app.include_router(index, prefix='/api/index', tags=['首页模块'])
app.include_router(goods, prefix='/api/goods', tags=['商品模块'])
app.include_router(image, prefix='/api/image', tags=['图库模块'])
app.include_router(notice, prefix='/api/notice', tags=['公告模块'])
# app.include_router(test, prefix='/test', tags=['测试模块'])


# 允许跨域
app.add_middleware(
    CORSMiddleware,
    # 允许跨域的源列表,例如 ["http://www.example.org"] 等等,["*"] 表示允许任何源
    allow_origins=["*"],
    allow_credentials=False,
    allow_methods=["*"],
    allow_headers=["*"],
)


if __name__ == '__main__':
  uvicorn.run('main:app', host='0.0.0.0', port=8000, reload=True, workers=1)

先到这吧, 后续来拆解具体项目细节, 这里只是环境部署做个笔记.

posted @ 2024-02-13 23:20  致于数据科学家的小陈  阅读(81)  评论(0编辑  收藏  举报