制作rpm包时python文件自动编译的问题
2017-11-21
现象
之前分配给公司实习生一个任务,需要制作一个带python脚本的rpm包,在制作时后发现他的rpm编译过程不会自动编译出.pyc
和.pyo
文件,所以安装出来的就不带.pyc
和.pyo
文件,他的.py脚本安装目录为/usr/local/bin/test
分析
rpmbuild在编译时用到的脚本都在/usr/lib/rpm
这个目录下的脚本,通过在rpmbuild时的输出看出,当制作带python脚本的rpm包时,具体执行/usr/lib/rpm/brp-python-bytecompile
这个脚本,猫腻就在这个脚本的最后一段
...
# Handle other locations in the filesystem using the default python
# implementation:
# Generate normal (.pyc) byte-compiled files.
$default_python -c 'import compileall, re, sys; sys.exit (not compileall.compile_dir("'"$RPM_BUILD_ROOT"'", '"$depth"', "/", 1, re.compile(r"'"/bin/|/sbin/|/usr/lib(64)?/python[0-9]\.[0-9]"'"), quiet=1))'
if [ $? -ne 0 -a 0$errors_terminate -ne 0 ]; then
# One or more of the files had a syntax error
exit 1
fi
# Generate optimized (.pyo) byte-compiled files.
$default_python -O -c 'import compileall, re, sys; sys.exit(not compileall.compile_dir("'"$RPM_BUILD_ROOT"'", '"$depth"', "/", 1, re.compile(r"'"/bin/|/sbin/|/usr/lib(64)?/python[0-9]\.[0-9]"'"), quiet=1))' > /dev/null
if [ $? -ne 0 -a 0$errors_terminate -ne 0 ]; then
# One or more of the files had a syntax error
exit 1
fi
exit 0
在使用compileall模块的compile_dir函数时,使用了一个正则表达式参数:
re.compile(r"'"/bin/|/sbin/|/usr/lib(64)?/python[0-9]\.[0-9]"'")
打开compileall模块的源码/usr/lib64/python2.7/compileall.py
找到compile_dir
这个函数,最终截取到下面一小段:
def compile_dir(dir, maxlevels=10, ddir=None,
force=0, rx=None, quiet=0):
...
if rx is not None:
mo = rx.search(fullname)
if mo:
return success
结论
当.py
脚本的安装目录路径上包含/bin /sbin /user/lib(xx)/pythonxx
这些目录节点时,就会跳过而不编译。