如何在Python包中包含预编译的.so和.dll文件?

问题描述 投票:0回答:2

我有一个 python 项目,它依赖于预编译的 .so (Unix) 和 .dll (Windows) 文件来工作,我正在尝试将其转换为可安装的包。但是,当您运行例如

pip install .
(在项目根目录中)时,我无法弄清楚如何获取包安装中包含的.so和.dll文件。

目录结构的效果是

.
├── ctypes_subdivider.cpp # C++ Source file 
├── __init__.py
├── lib
│   └── ctypes_OpenSubdiv.so # Precompiled libraries I'm trying to include 
│   └── ctypes_OpenSubdiv.dll
├── pysubdivision.py # Main python module 
├── README.md
├── setup.py
└── tests

我的 setup.py 文件看起来像这样

from setuptools import setup, find_packages 
import distutils.sysconfig

VERSION = '0.0.1'
DESCRIPTION = 'Python Catmull-Clark Subdivision.'
LONG_DESCRIPTION = 'A Python wrapper for the OpenSubdiv C++ Library far topology refiner.'

setup(
    name = "pysubdivision",
    version = VERSION,
    description = DESCRIPTION,
    long_description = LONG_DESCRIPTION,
    packages = find_packages(),    
    include_package_data=True,
    data_files = [(distutils.sysconfig.get_python_lib(),["lib/ctypes_OpenSubdiv.so"])],
    package_data={'Unix_so':['lib/ctypes_OpenSubdiv.so']},    
    install_requires = ["numpy"],
    keywords = ['subdivision','opensubdiv','Catmull-Clark','hard-surface'],
    classifiers= [
        "Development Status :: 0 - Alpha",
        "Intended Audience :: Developers",        
        "Programming Language :: Python :: 3",        
        "Operating System :: Microsoft :: Windows",
        "Operating System :: Unix",
    ]
)

我尝试在

pysubdivision.py
中加载 .so 文件的方式看起来像这样

import ctypes
import sys
from sys import platform 
import numpy as np
import os 

if platform == 'linux' or platform == 'linux2':
    _dir = os.path.dirname(sys.modules['Unix_so'].__file__)
    path = os.path.join(_dir,'ctypes_OpenSubdiv.so')
    OpenSubdiv_clib = ctypes.CDLL(path)

当我尝试导入模块时,出现错误

KeyError: 'Unix_so'

谢谢。如果我可以回答任何问题,请告诉我。

python dll setup.py python-packaging .so
2个回答
0
投票

查看setuptools文档以在运行时访问数据文件。 这应该意味着类似

from importlib.resources import files
path = files('Unix_so').joinpath('lib/ctypes_OpenSubdiv.so')
OpenSubdiv_clib = ctypes.CDLL(path)

适合您的设置,但由于您的项目布局不同,可能需要更多调整。


0
投票

我研究并找到了如何将文件保存在模块中,请按照此操作 这是我的模块目录结构

.
├── setup.py
├── exio -> (My Module Name)
|   └── __init__.py
|   └── exceptions.py
|   └── ffmpeg.py
|   └── Tools.rar
|   └── Runtime_Data.dll
|   └── log.txt
|   └── Tools
|       └── ffmpeg.exe
|       └── ImageViewer.exe
|       └── ZipETool.exe
|       └── 7z.dll
|       └── SevenZipExtractor.dll
|       └── x86
|           └── 7z.dll
|       └── x64
|           └── 7z.dll

我的setup.py(我尝试包含文件,并且在尝试后才这样做)

from setuptools import setup, find_namespace_packages

VERSION = '0.0.1'
DESCRIPTION = 'Top-Level IO Module For Microsoft Windows 11/10/8.1/8/7'
ld = """**Exio** Is Top-Level IO Module For Microsoft Windows 11/10/8.1/8/7

Why Exio Only For Microsoft Windows ?
The Exio Uses .exe & .dll To Open Images, Extract Zip Files And More...

> If You Try Exio In Other Operating Systems, Exio Will Raise OSError

## How To Import ?

```python
import exio
```

## Exio Guide Videos In Youtube

> So Exio Guide Videos Is Coming Soon..., Please Check Youtube Every Time If You Want To Learn"""
setup (
    name="exio",
    version=VERSION,
    author="VenzTechnolo",
    author_email="[email protected]",
    description=DESCRIPTION,
    long_description=ld,
    include_package_data=True,
    packages = find_namespace_packages(),
    package_dir={"exio": "exio"},
    package_data={"exio":["*.py", "*.txt", "*.dll", "*.rar"],
                  "exio.Tools":["*.exe", "*.dll"],
                  "exio.Tools.x86": ["*.dll"],
                  "exio.Tools.x64": ["*.dll"]},
    py_modules=["exceptions", "ffmpeg", "__init__"],
    keywords=["io", "IO", "extra", "ffmpeg"],
    classifiers=[
        "Environment :: Console",
        "Intended Audience :: Developers",
        "Programming Language :: Python :: 3",
        "Development Status :: 4 - Beta",
        "Operating System :: Microsoft :: Windows :: Windows 7",
        "Operating System :: Microsoft :: Windows :: Windows 8",
        "Operating System :: Microsoft :: Windows :: Windows 8.1",
        "Operating System :: Microsoft :: Windows :: Windows 10",
        "Operating System :: Microsoft :: Windows :: Windows 11"
    ]
)

对于你来说,我认为在你的 setup.py 中输入这些内容以包含所有内容

from setuptools import setup, find_namespace_packages
import sys

VERSION = '0.0.1'
DESCRIPTION = 'Python Catmull-Clark Subdivision.'
LONG_DESCRIPTION = 'A Python wrapper for the OpenSubdiv C++ Library far topology refiner.'

setup(
    name = "pysubdivision",
    version = VERSION,
    description = DESCRIPTION,
    long_description = LONG_DESCRIPTION,
    packages = find_namespace_packages(),    
    include_package_data=True,
    package_dir={"folder":sys.path[0]},
    package_data={"folder":["*.py", "*.md"],
                  "folder.lib":["*.so", "*.dll"]}, # If Don't Want To Include README file -> remove '*.md' from "folder" list    
    install_requires = ["numpy"],
    py_modules=["__init__"],
    keywords = ['subdivision','opensubdiv','Catmull-Clark','hard-surface'],
    classifiers= [
        "Development Status :: 0 - Alpha",
        "Intended Audience :: Developers",        
        "Programming Language :: Python :: 3",        
        "Operating System :: Microsoft :: Windows",
        "Operating System :: Unix",
    ]
)

如果这些更改不起作用,请更改您的 setup.py 文件路径 并遵循我的Setup.py文件

© www.soinside.com 2019 - 2024. All rights reserved.