此脚本能够编译整个目录下的python文件,并且会将存在错误的.py文件和__init__.py复制到build对应目录下,同时删除编译过程生成的.c和.o文件
- # coding:utf-8
- import sys, os, time, shutil
- from distutils.core import setup
- from Cython.Build import cythonize
-
- """
- 使用方法:
- file_name:setup.py
- # python setup.py dir(.py项目目录)
- 会将错误的.py文件和__init__.py复制到build对应目录下,同时删除编译过程生成的.c和.o文件
- """
-
- except_file = sys.argv[0]
- parent_path = sys.argv[1]
- start_time = time.time()
- build_dir = "build"
- build_tmp_dir = build_dir + "/temp"
- #项目前缀,比如python文件中出现 import a.b.c 则project_pre为a
- project_pre = ""
- py_list = []
- error_file = []
-
-
- def py2so_operations(parent_path=parent_path, excepts=(except_file), get_py=False, del_C=False, copy_init_py=False):
- base_path = os.path.abspath('.')
- full_path = os.path.join(base_path, parent_path)
- for fod_name in os.listdir(full_path):
- fod_path = os.path.join(full_path, fod_name)
- if os.path.isdir(fod_path) and fod_name != build_dir and not fod_name.startswith('.'):
- py2so_operations(parent_path=os.path.join(parent_path, fod_name), get_py=get_py,
- del_C=del_C)
- elif os.path.isfile(fod_path) and fod_name not in excepts:
- ext_name = os.path.splitext(fod_name)[1]
- if get_py is True and ext_name in ('.py', '.pyx') and not fod_name.startswith("__"):
- py_list.append(os.path.join(parent_path, fod_name))
- if del_C is True and ext_name == ".c":
- os.remove(fod_path)
- if copy_init_py is True and fod_name.startswith("__"):
- dst_dir = os.path.join(base_path, build_dir, base_path[base_path.find(project_pre):], parent_path)
- shutil.copyfile(fod_path, os.path.join(dst_dir, fod_name))
-
- def copy_error_py(file_list):
- for file in file_list:
- base_path = os.path.abspath('.')
- dst_dir = os.path.join(base_path,build_dir,base_path[base_path.find(project_pre):],file[:file.rfind("/")])
- if not os.path.isdir(dst_dir): os.makedirs(dst_dir)
- filename = file[file.rfind("/"):].replace("/","")
- file_path = os.path.join(base_path,file)
- shutil.copyfile(file_path,os.path.join(dst_dir,filename))
-
- def set_up(file_list):
- for file in file_list:
- try:
- setup(ext_modules=cythonize(file), script_args=["build_ext", "-b", build_dir, "-t", build_tmp_dir])
- except Exception as e:
- print "Error File:"+e.message
- file_list.remove(file)
- error_file.append(file)
- set_up(file_list)
- if os.path.exists(build_tmp_dir): shutil.rmtree(build_tmp_dir)
-
- if __name__ == '__main__':
- py2so_operations(get_py=True)
- set_up(py_list)
- copy_error_py(error_file)
- py2so_operations(del_C=True, copy_init_py=True)
-