PerKins Zhu

Le vent se lève,il faut tenter de vivre.

导航

freeswitch模块开发—mod_python3编译安装

Posted on 2025-03-14 10:59  PerKins.Zhu  阅读(245)  评论(0)    收藏  举报

1、复制mod_skel模块中的mod_python3.2017.vcxproj 和mod_python3.2017.vcxproj.user 两个文件。修改名字和内容中的mod_skel 为 mod_python3,之后把该解决方案导入到freeswitch\src\mod\languages\ 目录中。

    导入前需要安装swig重新生成  mod_python_wrap.cpp。 生成命令: swig -c++ -python  -ID:\myproject\visualCode\freeswitch\src\include\ -ID:\Anaconda3\envs\py312_env\include -outdir . -o mod_python_wrap.cpp mod_python.i

    之后导入依赖: echo #include "mod_python_extra.c" >> mod_python_wrap.cpp

参考下面deepseek的回答(MD格式)

<think>
好的,我需要帮助用户在VS2019环境下将mod_python3模块添加到FreeSWITCH项目中并成功编译。用户已经完成了FreeSWITCH的编译和运行,现在需要添加新的模块。根据提供的Makefile.am内容,我需要考虑如何将Autotools的配置转换为Visual Studio的项目设置。

首先,理解用户的需求:在VS2019中集成mod_python3模块。用户可能已经通过Autotools在Linux下编译过,但现在需要在Windows下使用VS2019。需要处理几个关键点:模块源代码的集成、依赖项配置(特别是Python3)、SWIG生成的包装代码的处理,以及项目属性的调整。

步骤一:将mod_python3源码添加到VS项目中。可能需要将mod_python3.c、freeswitch_python.cpp、mod_python_wrap.cpp等文件添加到解决方案的相应位置。需要注意的是mod_python_wrap.cpp是通过SWIG生成的,所以用户可能需要先运行SWIG生成该文件,或者确保该文件已经存在。如果用户没有预先生成,可能需要指导他们如何安装SWIG并生成包装代码,特别是Windows环境下可能需要额外步骤。

步骤二:配置Python3依赖。在VS项目中,需要设置包含目录和库目录。根据Makefile.am中的@PYTHON3_CFLAGS@和@PYTHON3_LDFLAGS@,这些在Autotools中可能指向Python3的头文件和库路径。在VS中,用户需要手动添加Python的include目录,以及链接到python3.lib或类似的库文件。需要确认用户安装的Python版本是否为3.x,并且是32位还是64位,与FreeSWITCH的编译配置是否一致。

步骤三:调整项目属性。mod_python3的编译选项,如预处理器定义、附加包含目录、运行时库链接等。例如,在VS中需要将模块设置为动态链接库(DLL),对应Autotools中的-shared选项。同时,可能需要添加特定的预处理器定义,如PYTHON3的版本相关宏。

步骤四:处理SWIG生成的代码。用户提供的Makefile.am中有通过SWIG生成mod_python_wrap.cpp的步骤,并且应用了一个补丁hack.diff。在Windows环境下,用户可能需要手动运行SWIG,或者配置预生成事件来自动执行SWIG命令。需要注意SWIG的路径是否正确,以及生成的代码是否符合Windows的编译要求。补丁的应用可能需要手动修改生成后的代码,或者在VS中设置生成后事件来应用补丁。

步骤五:安装配置。Makefile.am中的install-data-local部分负责将freeswitch.py复制到Python3的site-packages目录。在Windows下,用户可能需要手动将文件复制到正确的Python目录,或者在VS中添加生成后步骤来自动完成这一操作。此外,权限问题在Windows下可能不需要处理,但路径需要正确。

潜在的问题和解决方案:
1. SWIG生成错误:用户可能没有安装SWIG或版本不兼容。需要指导安装SWIG 3.0,并确保在PATH中可用。
2. Python头文件找不到:检查VS中的包含路径是否正确指向Python的include目录。
3. 链接错误:确保Python的库文件(如python3.lib)被正确链接,并且与编译的架构(x86/x64)一致。
4. 补丁应用问题:hack.diff可能包含特定于Linux的修改,在Windows下可能需要调整,或者用户需要手动修改生成的mod_python_wrap.cpp文件。
5. 运行时依赖:生成的mod_python3.dll可能需要Python3的DLL(如python3.dll)在系统路径中,或者放置在FreeSWITCH的模块目录下。

总结:用户需要在VS2019中配置新的项目,添加源文件和生成的SWIG代码,正确设置Python3的依赖路径和库,调整编译选项,处理SWIG生成和补丁应用,并确保安装步骤正确。可能需要逐步指导用户检查每个环节的设置,并提供具体的路径配置和命令行操作示例。
</think>

在 Visual Studio 2019 中为 FreeSWITCH 添加 `mod_python3` 模块的步骤如下:

---

### **一、准备源码和依赖**
#### 1. **将模块源码集成到 FreeSWITCH 项目中**
- 将 `mod_python3` 源码目录复制到 FreeSWITCH 的模块目录:
  ```
  freeswitch-src/src/mod/languages/
  ```
- 确保以下文件存在:
  - `mod_python3.c`
  - `freeswitch_python.cpp`
  - `mod_python_wrap.cpp`(需通过 SWIG 生成)
  - `mod_python.i`(SWIG 接口文件)
  - `mod_python_extra.c`
  - `hack.diff`(补丁文件)

#### 2. **安装依赖工具**
- **SWIG 3.0+**:从 [SWIG 官网](http://www.swig.org/download.html) 下载 Windows 版本并安装。
- **Python 3.x**:确保安装 Python 3 并勾选 **"Add Python to PATH"**。
- **验证安装**:
  ```bash
  swig -version    # 确认 SWIG 版本 >=3.0
  python --version # 确认 Python 3.x
  ```

---

### **二、生成 `mod_python_wrap.cpp`**
#### 1. **手动生成 SWIG 包装代码**
在 `mod_python3` 源码目录下运行以下命令:
```bash
swig -python -c++ -I..\..\..\..\src\include -oh mod_python_wrap.h -o mod_python_wrap.cpp mod_python.i
echo #include "mod_python_extra.c" >> mod_python_wrap.cpp
```
- **注意**:路径 `-I..\..\..\..\src\include` 需指向 FreeSWITCH 源码的 `include` 目录。

#### 2. **应用补丁文件**
```bash
patch -s -p0 -i hack.diff
```
- 如果 `patch` 命令不可用,手动根据 `hack.diff` 内容修改 `mod_python_wrap.cpp`。

---

### **三、配置 Visual Studio 2019 项目**
#### 1. **添加源码到解决方案**
1. 打开 FreeSWITCH 的 VS2019 解决方案(`.sln` 文件)。
2. 右键 `src/mod/languages` 目录 -> **添加 -> 现有项**,选择以下文件:
   - `mod_python3.c`
   - `freeswitch_python.cpp`
   - `mod_python_wrap.cpp`

#### 2. **配置 Python 3 依赖**
1. **包含目录**:
   - 右键项目 -> **属性 -> C/C++ -> 常规 -> 附加包含目录**,添加:
     ```
     $(PYTHON_INCLUDE_PATH)        # 例如 C:\Python39\include
     ..\..\..\libs\libteletone\src # 指向 libteletone 头文件
     ```
2. **库目录**:
   - **属性 -> 链接器 -> 常规 -> 附加库目录**,添加:
     ```
     $(PYTHON_LIB_PATH) # 例如 C:\Python39\libs
     ```
3. **链接库**:
   - **链接器 -> 输入 -> 附加依赖项**,添加:
     ```
     python39.lib       # 根据 Python 版本修改(如 python38.lib)
     ```

#### 3. **设置编译选项**
- **属性 -> C/C++ -> 预处理器 -> 预处理器定义**,添加:
  ```
  SWITCH_API_VISIBILITY=1
  _CRT_SECURE_NO_WARNINGS
  ```
- **属性 -> C/C++ -> 代码生成 -> 运行时库**:选择 `/MD` 或 `/MDd`(与 FreeSWITCH 主项目一致)。

#### 4. **生成动态库**
- **属性 -> 常规 -> 配置类型**:选择 **动态库 (.dll)**。

---

### **四、处理编译问题**
#### 1. **SWIG 生成的代码错误**
- 如果 `mod_python_wrap.cpp` 报错,检查以下内容:
  - SWIG 命令是否包含正确的 `-I` 路径。
  - `mod_python.i` 是否存在语法错误。

#### 2. **Python 头文件缺失**
- 确认 `PYTHON_INCLUDE_PATH` 是否指向正确的 Python 安装目录的 `include` 文件夹。

#### 3. **链接错误(未找到 Python 库)**
- 确认 `python39.lib` 文件名与安装的 Python 版本一致(如 `python38.lib`)。

---

### **五、安装模块**
#### 1. **复制生成的 DLL**
编译成功后,将生成的 `mod_python3.dll` 复制到 FreeSWITCH 的模块目录:
```
freeswitch\lib\Release\mod\
```

#### 2. **部署 Python 脚本**
将 `freeswitch.py` 复制到 Python 的 `site-packages` 目录:
```
C:\Python39\Lib\site-packages\
```

---

### **六、验证模块**
#### 1. **修改 `modules.conf`**
在 `conf/autoload_configs/modules.conf.xml` 中添加:
```xml
<load module="mod_python3"/>
```

#### 2. **重启 FreeSWITCH**
- 启动 FreeSWITCH 并检查日志:
  ```
  freeswitch> show modules | grep python3
  ```
  应输出 `mod_python3` 的加载信息。

---

### **七、附加说明**
- **补丁文件 `hack.diff`**:如果补丁无法直接应用,手动合并修改到 `mod_python_wrap.cpp`。
- **调试符号**:若需调试,编译时选择 **Debug** 配置,并确保 Python 的调试库(如 `python39_d.lib`)存在。

通过以上步骤,`mod_python3` 应能成功集成到 FreeSWITCH 并在 VS2019 中编译运行。

 

2、手动VS2019该解决方案下导入mod_python_wrap.cpp 和freeswitch_python.cpp 两个文件。

3、编译debug模式的python 。

  a、先安装正常版本的python3.X(安装大于3.10+版本,建议3.12)

  b、复制cpython 源码并进行编译。 

git clone https://gitcode.com/gh_mirrors/cp/cpython.git
cd cpython
git checkout  v3.XXX(替换为指定版本)
cd Tools\msi
build.bat -x64
// 生成内容在 cpython\PCbuild\amd64 目录下 (可把PCbuild下面的解决方案导入VS2018中进行编译生成)

  c、在VS2019 mod_python3中添加依赖库引用

4、生成mod_python3成功后,把下面四个文件复制到 freeswitch\x64\Debug\ 目录下

python312_d.dll 
python312_d.exp 
python312_d.lib 
python312_d.pdb 

 

5、load mod__python3 时如果提示未配置 PYTHONHOME PYTHONPATH,时,可在VS2019中配置环境属性(选中FreeswitchConsole解决方案右键)

 

 

注意: 如果把 如果把脚本文件放在 freeswitch/scripts目录下时,在xml中调用时,需要把scripts当中python的包。freeswitch mod_python3的sys.path 包括的是:freeswitch\x64\Debug

例如:

<action application="python" data="scripts.a" />
<action application="python" data="scripts.test.a" />