在python包setup.py中包含不同操作系统的二进制文件

2024-07-05 15:03:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个Python包mypackage,其中必须包含为Linux、Mac和Windows预编译的Fortran可执行二进制文件。我想将它们全部上传,但是当用户执行pip install my package操作时,它应该只下载相关的二进制文件并将它们添加到$PATH中,这样我就可以稍后运行subprocess.call(bin1)来调用二进制文件。 这个包裹看起来像

Project/
|-- bin/
|   |-- mac/
|   |    |--bin1
|   |    |--bin2
|   |-- windows/
|   |    |--bin1
|   |    |--bin2
|   |    |--dllfile_1
|   |    |--dllfile_2
|   |-- linux/
|        |--bin1
|        |--bin2
|
|-- src/
|   |   
|   |-- __init__.py
|   |-- main.py
|
|-- setup.py
|-- README

在我的setup.py中,我尝试了以下方法:

import system
if system == 'Linux':
    bin1 = 'bin/linux/bin1'
    bin2 = 'bin/linux/bin2'
    os='linux'
if system == 'Windows':
    bin1 = 'bin/win/bin1.exe'
    bin2 = 'bin/win/bin2.exe'
    os='win'
if system == 'Darwin':
    bin1 = 'bin/mac/bin1'
    bin2 = 'bin/mac/bin2'
    os='mac'

然后,如果在我的setuptools.setup()中包含data_files = [('bin',[bin1,bin2])]。当我从Mac上传软件包时,这似乎只在Mac上起作用,因为它只上传Mac二进制文件(总比什么都不上传好,但这还不够)。但是,我需要做一些类似data_files = [('bin',glob(f'{os}/*'))],(包括win的dll文件)的事情,这似乎根本不起作用(即pip show -f my package不包括任何二进制文件,而前一种情况是这样的)。解决这个问题的最佳方案是什么?我是否需要指定数据_文件中所有二进制文件的所有路径(如果需要,如何指定,因为glob()似乎不起作用),然后如何在pip install my package上下载特定于操作系统的二进制文件(以及如果win的dll文件)

我发现与此类似的所有其他问题要么太不一样,要么不完全符合我的要求


Tags: pip文件pypackagebinosmylinux