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

Windows下构建带入口点的noarch conda包的conda-build报错问题咨询

核心逻辑说明

noarch类型的conda包要求所有打包内容为平台无关的纯文本/字节码文件,Windows下setuptools默认生成的foo.exe是PE格式二进制,确实违反noarch规范;Linux下生成的无扩展名入口为纯文本Python脚本,符合要求。

一、合规构建带入口的noarch Python包的可行方案
  • 核心思路:放弃setuptools自动生成平台相关入口的默认逻辑,改用跨平台纯文本入口脚本,从根源上消除平台相关二进制
  • 具体操作:
    1. 移除pyproject.toml、setup.cfg或setup.py中的[options.entry_points]配置,关闭setuptools的自动入口生成逻辑
    2. 手动编写无扩展名的纯文本入口脚本,同时兼容类Unix和Windows系统,内容参考:
      #!/usr/bin/env python
      from bar import main
      if __name__ == "__main__":
          main()
      
    3. 在包配置中通过scripts参数指定上述手动编写的脚本,比如在setup.cfg中添加:
      [options]
      scripts = foo
      
    4. 在conda recipe的meta.yaml中正常设置build.noarch: python即可,所有打包内容均为平台无关文件,不会触发noarch合规报错
  • 优势:该方案生成的入口为纯文本,Windows和类Unix系统均能正常识别执行,完全符合noarch规范。
二、临时规避生成无扩展名入口包装的方案

如果需要保留entry_points配置的同时绕过Windows下exe生成的问题,可采用以下两类方案:

  • 方案1:修改setuptools入口生成参数
    构建前设置环境变量SETUPTOOLS_EXT_SUFFIX为空,强制setuptools生成纯文本入口而非exe:
    # Windows cmd 环境执行
    set SETUPTOOLS_EXT_SUFFIX=
    
    # Windows PowerShell 环境执行
    $env:SETUPTOOLS_EXT_SUFFIX=""
    
    该配置会让setuptools跳过Windows下的exe包装流程,直接生成无扩展名的纯文本入口脚本。
  • 方案2:conda-build层面临时替换生成文件
    在recipe的build.script中添加逻辑,在setuptools生成入口后自动替换exe文件:
    build:
      noarch: python
      script:
        - python -m pip install . --no-deps -vv
        - cd %SCRIPTS%
        - del foo.exe
        - echo #!/usr/bin/env python > foo
        - echo from bar import main >> foo
        - echo main() >> foo
    
    该逻辑会删除生成的foo.exe,替换为功能等价的无扩展名纯文本脚本,绕过noarch合规检查。

内容的提问来源于stack exchange,提问作者marscher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 12:54:04