Pyinstaller 打包 django 项目如何将命令行参数加入?

起因

Pyinstaller 打包 django 项目,打包成 manage.exe 后用命令行 cmd

manage.exe runserver 0.0.0.0:8001 --noreload 来运行感觉很不方便。

希望能够直接把命令行参数也打包进去,直接运行 exe 。我走了些弯路,但最终实现了。

弯路

我看到有人说 新建一个 main.py 在里面用 os.system :

复制代码
import os

os.system('manage.exe runserver 0.0.0.0:8001 --noreload')

看起来可行,在 manage.py 外包裹一层,但我尝试以后失败了,打包出的是一个这样的结果:

运行无反应。没去深究为啥失败,毕竟对于打包我也不是太熟悉。

一种可行办法

接下来是我自己的办法。

其实也很简单,找到 main 函数,改改参数列表就行了。

我的 Django 的 manage.py

复制代码
def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'src.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

注意这句:

复制代码
 execute_from_command_line(sys.argv)

从函数名也能知道,这是一个实现从命令行执行的函数,传入的正是 命令行参数列表 sys.argv

我们只要修改 sys.argv,就可以固定参数列表了。

但这里是有个小坑在的,如果是初学者可能会犯错。

sys.argv 是参数列表,不是字符串,所以不可以直接把 'runserver 0.0.0.0:8001 --noreload' 这串字符 append 进来,而要一个个来。

所以上面代码可以改为:

复制代码
        ) from exc
    print(sys.argv)
    sys.argv.append('runserver')
    sys.argv.append('0.0.0.0:8001')
    sys.argv.append('--noreload')
    print('增加参数后:')
    for a in sys.argv:
        print(a, end=' ')
    execute_from_command_line(sys.argv)

当然,写成列表再 append 上也行的。

复制代码
    argv = ['runserver', '0.0.0.0:8001', '--noreload']
	sys.argv.append(argv)

然后 pyinstaller -w -F manage.py 就会生成 manage.exe 了。

不过打包成 exe ,后续可能还会遇到其它问题,比如运行起来后,资源找不到的问题,需要一一解决,manage.spec 我只能提醒一下。

第二种办法

如果不一定要生成 exe,只需要方便运行,其实 写个 bat 脚本可能更方便一些。代码都不用动。

直接加一个 bat 脚本运行 manage.py ,然后发送脚本快捷方式到桌面。

bat 脚本参考:

复制代码
@echo off

REM 这里加了一个临时环境变量
set sslpath=D:\xxx\anaconda3-2020\Library\bin
set path=%sslpath%;%path%

REM 此处用全局路径会更合适,避免python升级影响。
python manage.py runserver 0.0.0.0:8001

pause
相关推荐
Ulyanov8 分钟前
Pymunk 2D物理游戏开发教程系列 第一篇:物理引擎入门篇 -《弹球大作战》
python·pygame·雷达电子战·仿真引擎
huabiangaozhi27 分钟前
vscode配置django环境并创建django项目(全图文操作)
vscode·django·sqlite
人工干智能43 分钟前
科普:list (列表),np.array (数组(多维)),torch.Tensor (张量),及其shape与reshape
python
AI职业加油站1 小时前
数据要素时代:大数据治理工程师证书深度解码
大数据·开发语言·人工智能·python·数据分析
amIZ AUSK1 小时前
Redis——使用 python 操作 redis 之从 hmse 迁移到 hset
数据库·redis·python
深蓝海拓1 小时前
基于QtPy (PySide6) 的PLC-HMI工程项目(二)系统规划
笔记·python·qt·学习·plc
迷藏4941 小时前
**雾计算中的边缘智能:基于Python的轻量级任务调度系统设计与实现**在物联网(IoT)飞速发展的今天,传统云
java·开发语言·python·物联网
biubiubiu07061 小时前
从 Python 和 Node.js 的流行看 Java 的真实位置
java·python·node.js
大江东去浪淘尽千古风流人物1 小时前
【Basalt】Basalt void SqrtKeypointVioEstimator<Scalar_>::optimize() VIO优化流程
数据库·人工智能·python·机器学习·oracle