如何在使用setuptools构建egg时以编程方式检测错误?

5 投票
1 回答
737 浏览
提问于 2025-04-15 19:04

如果我有一个脚本,它的作用是生成“蛋”(在编程中指的是一种打包格式),基本上是通过运行

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...

撰写回答