如何在使用setuptools构建egg时以编程方式检测错误?
如果我有一个脚本,它的作用是生成“蛋”(在编程中指的是一种打包格式),基本上是通过运行
python setup.py bdist_egg --exclude-source-files
来处理一些使用 setuptools
的 setup.py 文件,这些文件定义了如何构建这些“蛋”。那么,有没有简单的方法可以判断在构建“蛋”的过程中是否出现了错误呢?
我最近遇到的情况是,有一个模块里有语法错误。虽然 setuptools
在标准错误输出中显示了错误信息,但它还是继续创建了“蛋”,只是把出错的模块给省略掉了。因为这是批量创建多个“蛋”的过程,所以这个错误被忽略了,最终的结果是没用的。
有没有什么方法可以在程序中检测构建“蛋”时的错误,而不仅仅是捕获标准错误输出并解析它呢?
1 个回答
5
distutils
使用py_compile.compile()
这个函数来编译源文件。这个函数有一个叫doraise
的参数,当这个参数设置为True
时,如果编译出错就会抛出一个异常(默认情况下,它只是把错误信息打印到错误输出中)。但是,distutils
在调用py_compile.compile()
时并没有把doraise
设置为True
,所以如果编译出错,程序不会停止。
如果你想在出错时停止,并且能够检查setup.py
的返回代码(如果出错,返回的代码会是非零),你可以对py_compile.compile()
这个函数进行修改。例如,在你的setup.py
文件中:
from setuptools import setup
import py_compile
# Replace py_compile.compile with a function that calls it with doraise=True
orig_py_compile = py_compile.compile
def doraise_py_compile(file, cfile=None, dfile=None, doraise=False):
orig_py_compile(file, cfile=cfile, dfile=dfile, doraise=True)
py_compile.compile = doraise_py_compile
# Usual setup...