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
相关产品推荐
相关产品推荐

