2

我正在编写一个 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()I 中包含data_files = [('bin',[bin1,bin2])]. 当我从 Mac 上传包时,这似乎只适用于 Mac,因为它只上传 Mac 二进制文件(总比没有好,但即使这样也不够)。但是,我需要做一些类似的事情data_files = [('bin',glob(f'{os}/*'))],(包括 win 的 dll 文件),这似乎根本不起作用(即pip show -f my package不包括任何二进制文件,而它适用于前一种情况)。什么是最好的解决方案?我是否需要在 data_files 中指定所有二进制文件的所有路径(如果是这样,如何,因为 glob() 东西似乎不起作用) - 然后只有特定于操作系统的二进制文件(如果获胜,还有 dll 文件)下载于pip install my package.

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

4

0 回答 0