Python脚本转包后执行命令出现<star.cli.CLI object>冗余输出求助
问题解决:Python包console脚本末尾输出对象实例信息
问题根源
你在setup.py的console_scripts中直接将入口指向了CLI类。当Python执行console脚本时,会执行CLI()并自动打印该实例的字符串表示——这就是你看到<star.cli.CLI object at ...>的原因。而直接运行脚本或PyInstaller打包时,只是执行实例化操作但不会捕获并打印实例,因此没有这个问题。
解决方案
核心思路是让console脚本的入口指向一个无返回值的函数,而非直接指向类。以下是两种具体实现方式:
方式一:新增入口函数(最简修改)
修改src/star/__main__.py,新增main函数包裹类实例化:
from .cli import CLI def main(): # 仅实例化CLI,不返回实例 CLI() if __name__ == "__main__": main()
然后修改setup.py中的entry_points,将入口指向这个main函数:
entry_points={ "console_scripts": [ "star=star.__main__:main", ], },
方式二:拆分类的初始化与执行(更规范的结构)
如果希望类的职责更清晰,可以将业务逻辑从__init__中拆分到独立的run方法:
- 修改
src/star/cli.py的CLI类:
class CLI: def __init__(self) -> None: self.config = {} # 仅初始化参数解析和配置读取 self.parser = argparse.ArgumentParser(description="Star - Command Line Tool") self.parser.add_argument("script", metavar="script", nargs="?", default=None, help="Name of the script to run") self.parser.add_argument("-v", "--version", action="store_true", help="Display the version of Star") self.parser.add_argument("-l", "--list", action="store_true", help="List all available scripts", default=False) self.args = self.parser.parse_args() self.read_config_file() def run(self): # 原__init__中的业务逻辑移到这里 if self.args.version: self.display_version() elif self.args.list or self.args.script is None: self.display_script_list() else: self.run_script(self.args.script) # 其余方法(read_config_file、display_version等)保持不变
- 修改
src/star/__main__.py:
from .cli import CLI def main(): cli = CLI() cli.run() if __name__ == "__main__": main()
- 同样修改
setup.py的entry_points指向main函数,同方式一。
为什么修改__str__/__repr__没用?
即使你重写了这两个方法,Python依然会打印实例的字符串表示,只是内容改变而已。我们需要的是完全避免打印实例,因此让入口函数无返回值才是根本解决办法。
内容的提问来源于stack exchange,提问作者user22578280
相关产品推荐
相关产品推荐

