Python 打包成 wheel

## 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 文件夹下的库了
```

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值