Python 打包成 wheel

2023-05-16

## 1. 编写 setup.py
在项目的根目录下外面一个文件夹创建 `setup.py`   
`name`:指的是你打包后发布的名称(如`numpy`和`torch`)

`version`:版本号。

`packages`:需要处理的包目录(通常为包含 `__init__.py` 的文件夹)。  
`find_packages`:用于添加大量包的情况,`exclude`为排除的包,`include`为包含的包(网上大多都是这样写的,但是不知道是否需要加后缀什么的)。

`package_dir`:指定哪些目录下的文件被映射到哪个源码包。
  
`ext_modules`:指定扩展模块。

`install_requires`:需要安装的依赖。(如果没有代理下得太慢,不如写 `requirements.txt` 然后用国内镜像安装)


```py
from setuptools import find_packages, setup, Extension, Command
setup(name='center_net_obj_det',
      # 表示 CenterNet 文件夹中的都打包
      packages=[p for p in find_packages() if p.startswith('CenterNet')],   
      version='0.0.4'
      # ext_modules=[Extension('object_detection_tutorial', ['object_detection_tutorial.c'])],
      # install_requires=[
      #     'torch==0.4.1',
      #     'opencv-python',
      #     'Cython',
      #     'numba',
      #     'progress',
      #     'matplotlib',
      #     'easydict',
      #     'scipy',
      #     'numpy'
      # ]
      )
```

## 2. 生成 .whl 文件
先安装 `wheel`:`pip install wheel`

直接使用如下命令

```bash
python setup.py bdist_wheel
```

即可在当前目录生成一个 `dist` 文件夹,一个 `build` 文件夹和一个 `xxxx.egg-info` 文件。

## 3. 安装发布
进入文件夹 `dist`,里面也有一个 `xxx.whl` 文件,输入命令 `pip install xxx.whl` 即可安装。如果有已安装的版本,输入 `pip install xxx.whl --force` 即可重新安装。

安装后通过文件的组织结构来调用库,如某项目的文件架构如下

```
CenterNet
|-src
    |-object_detection_tutorial.py
    |-...
|-...
```

如果想要调用`object_detection_tutorial.py`的`ObjectDetection`类,需要如下导入

```py
from CenterNet.src.object_detection_tutorial import ObjectDetection
```

## 4. Bug
### 4.1 nms.so
报错信息为

```py
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/cuicui/CenterNet/src/object_detection_tutorial.py", line 16, in <module>
    from detectors.detector_factory import detector_factory
  File "/home/cuicui/CenterNet/src/lib/detectors/detector_factory.py", line 5, in <module>
    from .exdet import ExdetDetector
  File "/home/cuicui/CenterNet/src/lib/detectors/exdet.py", line 15, in <module>
    from external.nms import soft_nms
ImportError: /home/cuicui/CenterNet/src/lib/external/nms.so: undefined symbol: _Py_ZeroStruct
```

解决方法为进入对应文件夹重新编译并安装,如下

```bash
$ cd /home/cuicui/CenterNet/src/lib/external/
$ sudo make
$ python setup.py build_ext install
```

### 4.2 .so 文件无法 import
python 打包后 .so 文件无法 import,见[问题](问题.md)第四条

### 4.3 引用库路径问题
项目中如果把项目根目录作为 `Sources Root`,进行路径引用库会报错(使用相对路径不会报错),可以将需要 `import` 的路径加入系统路径,如下

```python
import os
import sys

this_dir = os.path.dirname(__file__)    # 可根据该地址进行相对路径的更改
sys.path.insert(0, this_dir)

import xxx      # 这样就可以引用 this_dir 文件夹下的库了
```

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 打包成 wheel 的相关文章

随机推荐

  • nvidia nx平台HDMIDP输出红色噪声调试记录

    1 前言 使用定制板 Jetpack版本是4 4 1 L4T 32 4 4 使用以下命令 当同时通过nvoverlaysink输出视频到HDMI DP时 在整个DP屏幕上出现红色噪声错误 gst launch 1 0 videotestsr
  • 没有实习我是不是就拿不到大厂offer了吗?---校招答疑

    可能是快放寒假了 xff0c 也可能是再有 2 3 个月就要进入 2020 年春招 xff08 应届生春季校招和暑期实习生招聘 xff09 了 越来越多的同学开始问实习的事情了 我认识的 20 届的同学有已经日常实习两个月以上的 xff0c
  • 最新42道计算机网络面试题!-- 附答案

    写在前面 计算机网络 计算机操作系统这两个 兄弟 是所有开发岗位都需要 结拜 的 xff0c 不管你是 Java C 43 43 还是测试 对于后端开发的童鞋来说 xff0c 计算机网络的重要性不亚于语言基础 xff0c 毕竟平时开发经常会
  • 秋招没拿到心仪offer,春招还有机会吗?该如何准备?

    最近很多秋招不理想或者考研不理想的同学问我这样一个问题 xff1a 互联网公司春招还有没有机会 xff1f 其实我相信大部分同学问这个问题的时候 xff0c 心里都是有答案的 xff0c 只不过想找一个他认为可以让他安心的人说出这个答案 那
  • 使用Filezilla Server软件配置FTP的全过程

    博主秋招提前批已拿百度 字节跳动 拼多多 顺丰等公司的offer xff0c 可加微信 xff1a pcwl Java 一起交流秋招面试经验 xff0c 可获得博主的秋招简历和复习笔记 使用Filezilla Server软件配置FTP的全
  • JAVA的四类八种基本数据类型

    先说明两个词汇的基本概念 xff1a bit xff08 位 xff09 xff1a 位是计算机中存储数据的最小单位 xff0c 指二进制数中的一个位数 xff0c 其值为 0 或 1 byte xff08 字节 xff09 xff1a 字
  • 集线器、交换机与路由器有什么区别?

    转发自 xff1a https mp weixin qq com s YXWBw3aFTSEFvkg oN9eQA 我相信我们都玩过一款特别火的游戏 xff1a 帝国时代 小时候想要玩帝国时代 xff0c 需要到软件城购买盗版光盘安装 xf
  • 【leetcode】第5题:最长回文子串

    目 录 一 暴力解法 二 动态规划 三 中心扩展法 四 Manacher 算法 先说明几个概念 xff1a 1 子串 xff1a 小于等于原字符串长度 xff0c 由原字符串中任意个连续 字符组成的子序列 xff1b 2 回文 xff1a
  • 字符串的排列与组合【Java 递归实现】

    我们在笔试中经常会遇到需要对字符串进行排列或者组合的题目 本篇文章对字符串的排列和组合进行递归版本的实现 如果你有更简单易懂的方法 xff0c 一定要在评论区留下来 1 字符串的组合 子序列 题目 xff1a 输入一个字符串 xff0c 输
  • 【手撕代码】多个线程交替打印

    目 录 xff1a 方法一 xff1a 锁实现 推荐 方法二 xff1a 信号量 semaphore 实现 推荐 方法三 xff1a wait notify 实现 方法四 xff1a 使用 Lock Condition 实现 面试的过程中
  • 【搞定算法】找出数组中出现次数大于数组长度一半和 N/K 的数

    博主秋招提前批已拿百度 字节跳动 拼多多 顺丰等公司的offer xff0c 可加微信 xff1a pcwl Java 一起交流秋招面试经验 目 录 xff1a 1 找出数组中出现次数大于数组长度一半的数 2 找出数组中出现次数大于数组长度
  • NVIDIA Jetson Nano 电源适配器 (供电)

    1 Jetson Nano 供电 Jetson Nano 的 micro USB 接口支持 2A 的电流 xff0c DC 供电接口支持 4A 电流 MicroUSB 在安全范围内的最大承载电流为 2A 实际项目中 CPU 满载 43 GP
  • 【搞定算法】常见算法题分类总览

    博主秋招提前批已拿百度 字节跳动 拼多多 顺丰等公司的offer xff0c 可加微信 xff1a pcwl Java 一起交流秋招面试经验 xff0c 可获得博主的秋招简历和复习笔记 完善中 由于本人平时刷题比较零散 xff0c 有时候找
  • 堆、栈的储存内容

    Java的JVM的内存可分为3个区 xff1a 堆 heap 栈 stack 和方法区 method 堆区 1 存储的全部是对象 xff0c 每个对象都包含一个与之对应的class的信息 class的目的是得到操作指令 2 jvm只有一个堆
  • 某32位系统下, C++程序,请计算sizeof 的值.

    某32 位系统下 C 43 43 程序 xff0c 请计算 sizeof 的值 void Foo 1 char str 100 cout lt lt 34 Foo 1 34 lt lt sizeof str lt lt endl char
  • python-pcl安装及使用

    在开始前 xff0c 先说明一下 xff0c pcl的库安装不简单 xff0c 不仅需要pip安装 xff0c 还需要安装C 43 43 的pcl库 xff0c 所以整个流程会比较漫长 鉴于官方参考网站的python pcl太麻烦 xff0
  • ROSBAG解析bag包教程

    一 软件安装教程 1 安装rosbag xff1a https www cnblogs com arkenstone p 6676203 html 2 安装mjepgtools和ffmpeg sudo apt get install mje
  • 双电机同步PID调试方法(二)

    由于双电机的PID上升曲线难以完全重合 xff0c 造成左右电机速度不一致 本文为了解决该问题设计了一种方法 主要思想是将不同速度对应的PWM占空比曲线拟合出来 xff0c 减1000 xff08 总10000 xff09 占空比后作为预设
  • exe打包成安装包

    前面介绍了如何将python代码打包成可执行文件 xff0c 这里再介绍一下如何将exe打包成安装包 一 安装InstallShield2015 百度云网址 xff1a https pan baidu com s 1fFGDeczPduWa
  • Python 打包成 wheel

    1 编写 setup py 在项目的根目录下外面一个文件夹创建 96 setup py 96 96 name 96 xff1a 指的是你打包后发布的名称 xff08 如 96 numpy 96 和 96 torch 96 xff09 96