首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

如何在arm单板中压缩python详解(3)

如何在arm单板中压缩python详解(3)

3.3.2.3 制作最小包的zip所谓的最小包,指的是在shell中执行python成功(可以进入python的命令环境)所需要的最少库。
那如何知道哪些是最基本的库呢?
执行python –v
可以打印加载python中出现的信息。
通过上面显示的所有加载库名称,就可以知道最基本的库了。
这里采用智能方法提取。
python –v 2>verbose.txt
(经测试,所有信息均是错误输出,所有只要2就可以了)
执行后,由于原来的等待用户输入的那一行也跑到文本中了,因此,无法继续了,新开一个shell窗口,ctrl+d关闭掉这个。
/opt/arm_python/code里放入如下这个程序:


123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869#!/usr/bin/env python

import sys
import shutil
import os

class CpBasicModules():
    def get_python_info(self):
        version = sys.version[:3]
        if len(sys.argv) == 1:
            print('default python version is {}'.format(version))
        elif len(sys.argv) == 2:
            version = sys.argv[1].strip().strip('python')
            if version[0].isdigit() and version[1] == '.' and version[2].isdigit():
                print('your python version is {}'.format(version))
            else:
                print('input python version like 2.7 , 3.3, or else')
                exit(1)
        else:
            print("too many paras")
            exit(1)

        self.python_zip = 'python{}{}.zip'.format(version[0], version[2])
        self.version = version

    def get_basic_modules(self):
        try:
            this_file = open('../bin/verbose.txt', 'r')
        except:
            print('''
            make sure verbose.txt is in your bin folder,
            and this file is in code folder,
            and code folder is parallel with bin folder
            ''')
            exit(1)

        lines = this_file.readlines()
        this_file.close()
        basic_module = []

        for line in lines:
            if '.pyc' not in line:continue
            parts = line.split(self.python_zip)
            pyc_name = parts[-1].lstrip('/').rstrip('\n')
            basic_module.append(pyc_name)
        self.basic_modules = basic_module

    def init_target_folder(self):
        target_folder = os.path.join(os.getcwd(), '../lib/python{}.min'.format(self.version))
        if os.path.exists(target_folder):
            shutil.rmtree(target_folder)
        os.mkdir(target_folder)
        self.target_folder = target_folder

    def cp_files(self):
        sh_name = 'get_python_min_lib.sh'
        sh_file_path = os.path.join(os.getcwd(), sh_name)
        src_folder = os.path.join(os.getcwd(), '../lib/python{}.bak'.format(self.version))
        with open(sh_file_path, 'w') as sh_file:
            str = 'cd {}'.format(src_folder)
            str += ' && '
            str += 'cp --parents '+' '.join(self.basic_modules)+' '+self.target_folder
            sh_file.write(str)
        os.system('chmod +x {}'.format(sh_file_path))


返回列表