问题描述
我正在使用cython软件包来调用Cpp API,在我的cpp代码中,我正在使用ffmpeg库,并且能够使用贝娄命令成功构建代码
python setup.py build_ext --inplace --compiler=msvc
但是当我尝试导入生成的pyd文件时,我得到了错误
PS D:\SiVUE\Backend\Cython\demo> python
Python 3.8.3 (tags/v3.8.3:6f8c832,May 13 2020,22:20:19) [MSC v.1925 32 bit (Intel)] on win32
Type "help","copyright","credits" or "license" for more information.
>>> import rect
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
ImportError: DLL load failed while importing rect: %1 is not a valid Win32 application.
>>>
下面提供了我的完整代码
header file
#ifndef RECTANGLE_H
#define RECTANGLE_H
#include <iostream>
extern "C"
{
#include "libavformat/avformat.h"
#include "libavutil/dict.h"
}
using namespace std;
namespace shapes
{
class Rectangle {
public:
int x0,y0,x1,y1;
Rectangle();
Rectangle(int x0,int y0,int x1,int y1);
~Rectangle();
int getArea();
int ffmpegFile();
void getSize(int* width,int* height);
void move(int dx,int dy);
};
}
#endif
ffmpegFile()中的Rectangle.Cpp文件,我主要在调用ffmpeg API
#include <iostream>
#include "Rectangle.hpp"
namespace shapes {
// Default constructor
Rectangle::Rectangle () {}
// Overloaded constructor
Rectangle::Rectangle (int x0,int y1) {
this->x0 = x0;
this->y0 = y0;
this->x1 = x1;
this->y1 = y1;
}
// Destructor
Rectangle::~Rectangle () {}
// Return the area of the rectangle
int Rectangle::getArea () {
return 10;
}
// Get the size of the rectangle.
// Put the size in the pointer args
void Rectangle::getSize (int *width,int *height) {
(*width) = x1 - x0;
(*height) = y1 - y0;
}
// Move the rectangle by dx dy
void Rectangle::move (int dx,int dy) {
this->x0 += dx;
this->y0 += dy;
this->x1 += dx;
this->y1 += dy;
}
int Rectangle::ffmpegFile()
{
AVFormatContext *fmt_ctx = NULL;
AVDictionaryEntry *tag = NULL;
int ret = 0;
char* filename = "D:\\Discovery.mp4";
if ((ret = avformat_open_input(&fmt_ctx,filename,NULL,NULL)))
return ret;
if ((ret = avformat_find_stream_info(fmt_ctx,NULL)) < 0) {
av_log(NULL,AV_LOG_ERROR,"Cannot find stream information\n");
return ret;
}
while ((tag = av_dict_get(fmt_ctx->metadata,"",tag,AV_DICT_IGNORE_SUFFIX)))
printf("%s=%s\n",tag->key,tag->value);
avformat_close_input(&fmt_ctx);
return ret;
}
}
用于cpp文件功能和变量的Rectangle.pxd文件声明
cdef extern from "Rectangle.cpp":
pass
cdef extern from "Rectangle.hpp" namespace "shapes":
cdef cppclass Rectangle:
Rectangle() except +
Rectangle(int,int,int) except +
int x0,y1
int getArea()
void getSize(int* width,int* height)
void move(int,int)
int ffmpegFile()
rect.pyx文件,我正在调用cpp API
# distutils: language = c++
from Rectangle cimport Rectangle
cdef class PyRectangle:
cdef Rectangle c_rect # Hold a C++ instance which we're wrapping
def __cinit__(self,int x0,int y1):
self.c_rect = Rectangle(x0,y1)
def get_area(self):
return self.c_rect.getArea()
def get_size(self):
cdef int width,height
self.c_rect.getSize(&width,&height)
return width,height
def move(self):
print(self.c_rect.ffmpegFile())
setup.py 我提供了pyx文件和ffmpeg库路径以及包含路径
from distutils.core import setup
from setuptools import Extension
from Cython.Build import cythonize
sfc_module = [Extension('rect',sources = ['rect.pyx'],include_dirs = ['D:\\SiVUE\\Backend\\Cython\\demo\\ffmpeg\\include\\'],library_dirs = ['D:\\SiVUE\\Backend\\Cython\\demo\\ffmpeg\\lib\\'],libraries = ['avcodec','avdevice','avfilter','avformat','avutil','postproc','swresample','swscale'],language='c++')]
setup(name = 'superfastcode',version = '1.0',description = 'Python Package with superfastcode C++ extension',ext_modules = cythonize(sfc_module),include_dirs = ['D:\\SiVUE\\Backend\\Cython\\demo\\ffmpeg\\include\\']
)
谢谢
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)