微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

仅使用 cython 二进制 .so 文件和配置、资源文件夹构建和安装 Python 轮包

如何解决仅使用 cython 二进制 .so 文件和配置、资源文件夹构建和安装 Python 轮包

我的代码结构如下:

myMLCode 
│  
├── main.py
├── ML_lib
|   ├── __init__.py
│   └── core.py
|   └── set1
|       ├── __init__.py
│       └── mymod1.py
│       └── mymod2.py
|   └── set2
|       ├── __init__.py
│       └── mymod3.py
│       └── mymod4.py
├── config
│   ├── config1.yml
│   └── config2.yml
├── models
│   ├── model1.h5
│   └── model2.h5
├── setup.py 

我想做的是使用整个包中的 cythonized 代码制作一个文件,并能够无缝运行代码

期望与 python main.py 一起运行 另外我想不时编辑配置文件并更新模型文件并继续使用该包。

到目前为止我设法做的是使用以下 setup.py 文件

from Cython.distutils import build_ext
from Cython.Build import cythonize
from setuptools.extension import Extension
from setuptools.command.build_py import build_py as build_py_orig
from pathlib import Path
from setuptools import find_packages,setup,Command
import os
import shutil


class MyBuildExt(build_ext):
    def run(self):
        build_ext.run(self)

        build_dir = Path(self.build_lib)
        root_dir = Path(__file__).parent

        target_dir = build_dir if not self.inplace else root_dir

        self.copy_file('ML_lib/__init__.py',root_dir,target_dir)
        self.copy_file('ML_lib/set1/__init__.py',target_dir)
        self.copy_file('Ml_lib/set2/__init__.py',target_dir)

def copy_file(self,path,source_dir,destination_dir):
    if not (source_dir / path).exists():
        return

    shutil.copyfile(str(source_dir / path),str(destination_dir / path))

extensions = [
    Extension("core",["core.py"]),Extension("ML_lib.set1.*",["ML_lib/set2/*.py"]),Extension("ML_lib.set2.*",Extension("ML_lib.*",["ML_lib/*.py"]),]

setup(
    name="myMLCode",version="0.0.1",author="myself",description="This is compiled ML code",ext_modules=cythonize(
        extensions,build_dir="build",compiler_directives=dict(
        always_allow_keywords=True
        )),data_files=[
        ('config',['config/config1.yml']),('config',['config/config2.yml']),('models',['models/model1.h5']),['models/model2h5']),],cmdclass={
        'build_ext': MyBuildExt
    },entry_points={
    },)

这将生成一个包含以下内容的轮文件

myMLCode-0.0.1-cp37-cp37m-linux_x86_64.whl
------------------------------------------
 main.cpython-37m-x86_64-linux-gnu.so'
'ML_lib/__init__.cpython-37m-x86_64-linux-gnu.so'
'ML_lib/__init__.py'
'ML_lib/core.cpython-37m-x86_64-linux-gnu.so'
'ML_lib/set1/mymod1.cpython-37m-x86_64-linux-gnu.so'
'ML_lib/set1/mymod2.cpython-37m-x86_64-linux-gnu.so'
'ML_lib/set1/__init__.cpython-37m-x86_64-linux-gnu.so'
'ML_lib/set1/__init__.py'
'ML_lib/set2/mymod3.cpython-37m-x86_64-linux-gnu.so'
'ML_lib/set2/mymod4.cpython-37m-x86_64-linux-gnu.so'
'ML_lib/set2/__init__.cpython-37m-x86_64-linux-gnu.so'
'ML_lib/set2/__init__.py'
'myMLCode-0.0.1.data/data/config/config1.yml'
'myMLCode-0.0.1.data/data/config/config2.yml'
'myMLCode-0.0.1.data/data/models/model1.h5'
'myMLCode-0.0.1.data/data/models/model2.h5'
'myMLCode-0.0.1.dist-info/MetaDATA'
'myMLCode-0.0.1.dist-info/WHEEL'
'myMLCode-0.0.1.dist-info/top_level.txt'
'myMLCode-0.0.1.dist-info/RECORD'

然后我用 pip install 安装了这个轮文件。 我列出了库以检查它是否已安装,然后打开一个 python3.7 终端来使用它,但出现导入错误

[user@userhome~]$ pip3.7 list
Package            Version
------------------ -------
appdirs            1.4.4
distlib            0.3.1
filelock           3.0.12
importlib-Metadata 4.0.1
pip                20.1.1
setuptools         47.1.0
six                1.15.0
typing-extensions  3.7.4.3
virtualenv         20.4.4
myMLCode           0.0.1
zipp               3.4.1
[user@userhome ~]$ python3.7
Python 3.7.9 (default,Apr 27 2021,07:49:13)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help","copyright","credits" or "license" for more information.
>>> import myMLCode
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>

ModuleNotFoundError: No module named 'myMLCode'

我尝试解压缩包并尝试直接使用 .so 文件运行代码。除了配置和模型文件引用外,它运行良好。该包将文件放在 myMLCode.data.data.config 和 myMLCode.data.data.models 中。我做了一个 hack 并更改了源代码中的所有相对路径以引用这个新位置。它适用于此,但这不是一个优雅的解决方案,因为纯 python 代码停止工作,因为它不知道这些新文件夹。

任何指针都会非常有帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。