通过pip安装的setuptools entry_points入口脚本无法exec执行Python脚本
问题根因
你的代码问题出在argparse参数解析环节,程序根本没有执行到exec那行。
修复步骤
1. 解决多余参数被argparse拦截的问题
你当前的argparse配置只声明了script一个位置参数,当执行pkgexec script.py -v arg1 arg2时,argparse检测到后面的-v、arg1、arg2是未声明的参数,会直接抛出错误并终止程序,所以exec代码完全没有运行。
修复方法是把parse_args()换成parse_known_args(),将用户脚本自身的参数单独提取出来,再赋值给sys.argv保证用户脚本可以正常读取参数:
# 拆分入口点参数和用户脚本参数 cli_args, script_args = parser.parse_known_args(args) # 替换sys.argv供用户脚本读取 sys.argv = [cli_args.script] + script_args
2. 修正exec执行上下文配置
直接给exec传当前环境的globals()会污染运行环境,而且用户脚本里的if __name__ == "__main__"逻辑无法触发,建议自定义独立的全局命名空间,还可以提前把你要暴露给用户的包能力注入进去:
# 构建独立的全局命名空间 script_globals = { "__name__": "__main__", "__file__": cli_args.script, # 注入你要暴露给用户的包能力 "some_stuff": some_stuff } # 读取脚本内容执行 with open(cli_args.script, 'r', encoding='utf-8') as f: script_code = f.read() exec(script_code, script_globals, script_globals)
完整修复后的__main__.py代码
import argparse import sys from pkgexec import some_stuff def main(args=None): if args is None: args = sys.argv[1:] parser = argparse.ArgumentParser() parser.add_argument('script', help='script to run via pkgexec') # 你自己的入口点参数在这里添加 parser.add_argument('-V', '--version', action='version', version='%(prog)s 0.2.0') cli_args, script_args = parser.parse_known_args(args) sys.argv = [cli_args.script] + script_args print(f'{__name__}: Running script {cli_args.script}') script_globals = { "__name__": "__main__", "__file__": cli_args.script, "some_stuff": some_stuff } with open(cli_args.script, 'r', encoding='utf-8') as f: exec(f.read(), script_globals, script_globals) print(f'{__name__}: Done') if __name__ == '__main__': sys.exit(main())
内容的提问来源于stack exchange,提问作者user3638629
相关产品推荐
相关产品推荐

