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

Python打包:如何从非包目录获取二进制文件a.out的路径?

获取打包后二进制文件a.out的路径方法

要实现module.py中调用a.out,需要分两步:配置打包规则确保文件被包含,再在代码中正确获取路径。

一、配置setuptools打包规则

首先要让setuptools在打包时将a.out包含到分发包中,有两种常见方式:

方式1:调整目录结构(推荐)

把src/bin目录移动到src/package下,目录结构变为:

project
├── LICENSE.srt
├── README.md
├── pyproject.toml
├── setup.cfg
└── src
    └── package
        ├── __init__.py
        ├── module.py
        └── bin
            └── a.out

然后修改setup.cfg,添加包资源配置:

[options]
package_dir =
    = src
packages = find:
include_package_data = True

[options.package_data]
package =
    bin/a.out

同时创建MANIFEST.in文件,添加:

include src/package/bin/a.out

方式2:保留原目录结构

如果不想调整目录,修改setup.cfg:

[options]
package_dir =
    = src
packages = find:
include_package_data = True

[options.package_data]
package =
    ../bin/a.out

对应的MANIFEST.in添加:

include src/bin/a.out

二、在module.py中获取路径并执行

使用Python标准库的importlib.resources(Python 3.7+推荐)来获取资源文件路径,示例代码:

import subprocess
from importlib.resources import files, as_file

def execute_a_out():
    # 定位到package包下的bin/a.out(原目录结构则路径改为'../bin/a.out')
    with as_file(files("package").joinpath("bin", "a.out")) as a_out_path:
        # 执行二进制文件
        proc = subprocess.run(
            [str(a_out_path)],
            capture_output=True,
            text=True,
            check=True
        )
        # 处理输出
        print(proc.stdout)

兼容Python 3.6及以下

如果需要兼容旧版本,可使用pkg_resources(属于setuptools模块):

import subprocess
import pkg_resources

def execute_a_out():
    a_out_path = pkg_resources.resource_filename("package", "bin/a.out")
    proc = subprocess.run(
        [a_out_path],
        capture_output=True,
        text=True,
        check=True
    )
    print(proc.stdout)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:40:36