You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:48:00