我正在编写一个 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
.
我发现与此类似的所有其他问题要么太不同,要么不完全符合我的要求。