# 22、打包django项目成exe文件

## pyinstaller打包django项目成exe文件

* 环境： linux

| 可选参数 | 示例                                 | 说明                                              |
| ---- | ---------------------------------- | ----------------------------------------------- |
| -F   | pyinstaller -F demo.py             | 只在dist文件夹中生成一个程序demo.exe文件，适用于一个模块没有多依赖.py文件    |
| -D   | pyinstaller -D demo.py             | 默认选项，除了主程序demo.exe外，还会在在dist文件夹中生成很多依赖文件，推荐使用这个 |
| -c   | pyinstaller -c demo.py             | 默认选项，只对windows有效，使用控制台                          |
| -w   | pyinstaller -w demo.py             | 只对windows有效，不使用控制台                              |
| -p   | pyinstaller -p D:\project\demo.py  | 设置导入路径                                          |
| -i   | pyinstaller -i D:\demo.ico demo.py | 给生成的demo.exe文件设置一个自定义的图标                        |

### 第一步 安装PyInstaller

```python
pip install pyinstaller
```

注意: 如果你的python3 是编译安装的, 编译时参数没指定 --enable-shared , 则无法使用,需要重新编译,带上这个参数;

### 第二步 制作项目的.spec文件

```python
pyi-makespec -D manage.py
```

### 第三步 生产exe文件

```python
pyinstaller manage.spec

# 会生成dist/manage , 所有依赖会统统打包到这个目录:
```

* 运行

```python
./manage runserver 0.0.0.0:8000
```

## 打包遇到的问题

**问题1： 运行服务是会提示No module named XXX**

```python
# 这是因为Django有些module不会自动收集，需要手动添加
# 解决方法：在manage.spec文件中修改

hiddenimports=[]
为
hiddenimports=["Django","xlwt","pytz","wheel","att.apps"],

# 提示缺少什么module就在此处添加什么。
```

**问题2：打开网页出现TemplateDoesNotExist 错误**

> 解决方法：根据错误的提示消息，把项目中的模板文件templates拷贝到相应的位置，刷新页面即可。

**问题3：网页丢失CSS、JS**

```python
# settings.py 文件内添加
STATIC_ROOT = os.path.join(BASE_DIR, 'static', 'static_root')


# 终端执行，将静态文件收录到 static_root 中
python manage.py collectstatic




# urls.py 添加代码
from django.conf.urls import static
from 项目名 import settings

urlpatterns += static.static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
```
