Python 项目的创建开发、安装部署问题

作者 Marlous 日期 2019-04-11
Python 项目的创建开发、安装部署问题

参考:
1、 pipenv 笔记
2、 python的构建工具setup.py
3、 关于python打包成exe的一点经验之谈
4、 使用pycharm将python项目打包成exe运行文件
5、 pyinstaller参数介绍以及总结

一 项目创建

  1. 全新的项目:
  • 已经安装了 Pipenv 库。

  • 创建项目的文件夹。

  • 命令行下进入此文件夹,pipenv install 创建虚拟环境。

  • 使用 pipenv shell 激活虚拟环境,激活后使用命令 pip install 安装的才在此项目的虚拟环境中。

  • PyCharm 创建项目选择刚才创建的文件夹。

  • 设置解释器为刚才创建的虚拟环境下的(会自动选择好)。

  • 每次安装库时,用命令行在项目文件夹根目录使用 pip install XXX

  1. pull 已存在的项目:
  • 拉取项目到本地。

  • PyCharm 创建项目选择刚才创建的文件夹。

  • 如果该项目使用 Pipenv 进行包管理,直接命令行下进入此文件夹,pipenv install,会自动创建虚拟环境和安装 pipfile 中的库。

二 项目部署打包分发

部署的几个问题:

  • 需要依赖的包
  • 自己写的包
  • 怎样找到依赖的包、自己写的包

1 setup.py 打包

python的构建工具setup.py
python如何将自己写的代码打包供他人使用
Python打包分发工具setuptools简介

  • 使用 setup.py 打包,然后在代码文件夹下执行命令 python setup.py install ,然后就可以使用这个自己做的包了,如同 requests 模块一样,可以在代码中调用这个包。会安装到 python 的 site-package 目录下。

  • setup.py 模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from setuptools import setup, find_packages
setup(
name="HelloWorld",
version="0.1",
packages=find_packages(),
scripts=['say_hello.py'],

# Project uses reStructuredText, so ensure that the docutils get
# installed or upgraded on the target machine
install_requires=['docutils>=0.3'],

package_data={
# If any package contains *.txt or *.rst files, include them:
'': ['*.txt', '*.rst'],
# And include any *.msg files found in the 'hello' package, too:
'hello': ['*.msg'],
},

# metadata for upload to PyPI
author="Me",
author_email="me@example.com",
description="This is an Example Package",
license="PSF",
keywords="hello world example examples",
url="http://example.com/HelloWorld/", # project home page, if any

# could also include long_description, download_url, classifiers, etc.
)

2 打包成不同平台可执行文件

使用pycharm将python项目打包成exe运行文件

  • 在 PyCharm 中的默认设置安装 PyInstaller。(原理:PyInstaller 把 python 解析器和你自己的脚本打包成一个可执行的文件,和编译成真正的机器码完全是两回事,所以千万不要指望成打包成一个可执行文件会提高运行效率,相反可能会降低运行效率,好处就是在运行者的机器上不用安装 python 和你的脚本依赖的库)。

  • PyCharm 中打开终端,pyinstaller -F XXXX.py,XXXX.py 是主程序名(指明路径)。

1
2
3
4
5
6
7
一些参数:

–icon=图标路径(pyinstaller -F --icon=my.ico XXXX.py)
-F 打包成一个exe文件
-w 使用窗口,无控制台
-c 使用控制台,无窗口
-D 创建一个目录,里面包含 exe 以及其他一些依赖性文件
  • 为了方便可以写成 python 脚本,如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# -*- coding: utf-8 -*-

"""
打包成 exe 可执行文件
需要先安装 PyInstaller
目录结构为:
WFACat\setup\setup_PyInstaller\setup_PyInstaller.py
WFACat\WFACatPro\main.py
打包好的文件会生成在 WFACat\setup\setup_PyInstaller\ 文件夹下
"""


import os

if __name__ == '__main__':
os.system("pyinstaller --icon=\"../../asset/icon_128.ico\" --name=\"WFACatPro by Marlous\" -c \"../../WFACatPro/main.py\"")
  • 坑一:
    main.py(主函数入口文件)不能和其它模块放在同一级文件夹中。否则打包不成功,需要使用 --hidden-import 一个个模块列出来。懒得一个个列出来,可以将其它模块放在与 main.py 同级的文件夹下(当作包使用)。

  • 坑二:
    使用 pyinstaller 打包的时候,仅打包 .py 文件,其余依赖项(如图片资源等其它文件)只需在打包完成后,拷入打包生成的根目录即可。

  • 坑三:
    如果项目中使用 os.system('xxx.py') 执行脚本方式调用子模块的话,打包成 exe 会没法找到子模块。使用构建工具 setup.py 构建。或是不要使用这种类似 C 语言的面向过程编程范式,而是使用面向对象编程范式。

3 通过虚拟环境打包独立应用

  • setup.py 打包适用于向别人提供包使用。/ 通常打包成独立的应用程序使用 pyinstaller。

  • 现在如果我不想打包成独立的应用,也不是制作成包,而是想做成可以脱离 IDE 直接使用的应用程序怎么办呢。

  • 首先确保项目在 IDE(使用的虚拟环境)下正常运行。将虚拟环境复制一份出来,将代项目运行需要的 py 文件和相关资源复制出来,放在同一个文件夹中。把需要的东西从项目中抠出来,毕竟 README 等东西不一定需要。

  • 将自己的项目路径添加进环境变量 PYTHONPATH,或其他方法。参考:自定义模块的3种导入方式python模块以及导入出现ImportError: No module named ‘xxx’问题

1
2
3
4
5
6
7
# main.py 临时
# -*- coding: utf-8 -*-

import sys
sys.path.append(r"C:\Users\Pwcong\Desktop\python")

import pwcong