我有一个 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'
。
谢谢。如果我可以回答任何问题,请告诉我。
查看setuptools文档以在运行时访问数据文件。 这应该意味着类似
from importlib.resources import files
path = files('Unix_so').joinpath('lib/ctypes_OpenSubdiv.so')
OpenSubdiv_clib = ctypes.CDLL(path)
适合您的设置,但由于您的项目布局不同,可能需要更多调整。
我研究并找到了如何将文件保存在模块中,请按照此操作 这是我的模块目录结构
.
├── 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文件