Python CTypes\u argtypes没有from\u params方法 我的任务是使用 ctypes。过去我一直在编码和做研究 几周后,有一个问题要问任何愿意回答的人 救命啊。这段C代码是我正在使用的代码的最佳复制,所以请记住,我并没有按照它呈现的方式来构造它 我对python和ctypes库都比较陌生 在linux上使用Python 2.7.2和GCC 4.4.2

Python CTypes\u argtypes没有from\u params方法 我的任务是使用 ctypes。过去我一直在编码和做研究 几周后,有一个问题要问任何愿意回答的人 救命啊。这段C代码是我正在使用的代码的最佳复制,所以请记住,我并没有按照它呈现的方式来构造它 我对python和ctypes库都比较陌生 在linux上使用Python 2.7.2和GCC 4.4.2,python,ctypes,Python,Ctypes,问题: 当我尝试运行以下python代码时,会出现以下错误: 文件“pydog.py”,第21行,在 srclib.log_dog.argtypes=[pug] TypeError:argtypes中的项1没有from_param方法 pydog.py: import ctypes from ctypes import * srclib = ctypes.CDLL('/path/DogHouse.so') class dog(Structure): _fields_ = [

问题: 当我尝试运行以下python代码时,会出现以下错误:
文件“pydog.py”,第21行,在
srclib.log_dog.argtypes=[pug]
TypeError:argtypes中的项1没有from_param方法

pydog.py:

import ctypes
from ctypes import *

 srclib = ctypes.CDLL('/path/DogHouse.so')

 class dog(Structure):
    _fields_ = [
        ("name", ctypes.c_char*10),
        ("color", ctypes.c_char*10)]    

pug = dog("doug", "white")

#- Not sure if I need to define arg and res types -#
srclib.log_dog.argtypes = [pug]
#srclib.log_dog.restype = 

srclib.log_dog(pug)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* opaque handle */
typedef struct __dog_file dogfile;

/* Input data structure */
typedef struct __dog_input{
    const char *name;
    const char *color;
    }dog_input;

/*Logs the dog_input data into the dog_file struct */
dog_file *log_dog(const dog_input *data);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "DogHouse.h"

struct __dog_file{
    const char *name;
    const char *color;
    };

dog_file *log_dog(const dog_input *data){

        dog_file *df;               
        df->name = data->name;
        df->color = data->color;

        return df;
}

int main(int argc, char **argv){

}
DogHouse.h:

import ctypes
from ctypes import *

 srclib = ctypes.CDLL('/path/DogHouse.so')

 class dog(Structure):
    _fields_ = [
        ("name", ctypes.c_char*10),
        ("color", ctypes.c_char*10)]    

pug = dog("doug", "white")

#- Not sure if I need to define arg and res types -#
srclib.log_dog.argtypes = [pug]
#srclib.log_dog.restype = 

srclib.log_dog(pug)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* opaque handle */
typedef struct __dog_file dogfile;

/* Input data structure */
typedef struct __dog_input{
    const char *name;
    const char *color;
    }dog_input;

/*Logs the dog_input data into the dog_file struct */
dog_file *log_dog(const dog_input *data);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "DogHouse.h"

struct __dog_file{
    const char *name;
    const char *color;
    };

dog_file *log_dog(const dog_input *data){

        dog_file *df;               
        df->name = data->name;
        df->color = data->color;

        return df;
}

int main(int argc, char **argv){

}
#包括
#包括
#包括
/*不透明手柄*/
typedef结构uu dog_文件dogfile;
/*输入数据结构*/
类型定义结构\uuuu狗\u输入{
常量字符*名称;
常量字符*颜色;
}狗输入;
/*将dog_输入数据记录到dog_文件结构中*/
狗文件*日志狗(常数狗输入*数据);
DogHouse.c:

import ctypes
from ctypes import *

 srclib = ctypes.CDLL('/path/DogHouse.so')

 class dog(Structure):
    _fields_ = [
        ("name", ctypes.c_char*10),
        ("color", ctypes.c_char*10)]    

pug = dog("doug", "white")

#- Not sure if I need to define arg and res types -#
srclib.log_dog.argtypes = [pug]
#srclib.log_dog.restype = 

srclib.log_dog(pug)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* opaque handle */
typedef struct __dog_file dogfile;

/* Input data structure */
typedef struct __dog_input{
    const char *name;
    const char *color;
    }dog_input;

/*Logs the dog_input data into the dog_file struct */
dog_file *log_dog(const dog_input *data);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "DogHouse.h"

struct __dog_file{
    const char *name;
    const char *color;
    };

dog_file *log_dog(const dog_input *data){

        dog_file *df;               
        df->name = data->name;
        df->color = data->color;

        return df;
}

int main(int argc, char **argv){

}
#包括
#包括
#包括
#包括“DogHouse.h”
结构狗文件{
常量字符*名称;
常量字符*颜色;
};
狗文件*日志狗(常数狗输入*数据){
dog_文件*df;
df->name=数据->名称;
df->color=数据->颜色;
返回df;
}
int main(int argc,字符**argv){
}
我试图找到“from_param”的语法,但找不到具体需要的语法(我不确定它是特定于ctypes的,还是python库的标准)


这是我关于SO的第一个问题,如果我需要更改任何内容/说得更清楚,请让我知道!提前感谢您的帮助。

argtypes中的值应该是类型。
pug
就是一个例子。给出的代码不会编译,但我想到了以下内容:

pydog.py

import ctypes

srclib = ctypes.CDLL('DogHouse')

# An opaque class
class dog_file(ctypes.Structure):
   pass

# c_char_p should be used for "const char *"
class dog_input(ctypes.Structure):
    _fields_ = [
        ("name", ctypes.c_char_p),
        ("color", ctypes.c_char_p)]    

srclib.log_dog.argtypes = [ctypes.POINTER(dog_input)] # pointer type
srclib.log_dog.restype =  ctypes.POINTER(dog_file) # pointer type to opaque class

# bytes strings used for const char* (Python 3 syntax)
# create instance and pass it to function
pug = dog_input(b'doug',b'white')
print(srclib.log_dog(pug))
DogHouse.h

/* opaque handle */
typedef struct dog_file dog_file;

/* Input data structure */
typedef struct dog_input
{
    const char* name;
    const char* color;
} dog_input;

/*Logs the dog_input data into the dog_file struct */
__declspec(dllexport)
dog_file* log_dog(const dog_input* data);
DogHouse.c

#include <stdlib.h>
#include "DogHouse.h"

typedef struct dog_file
{
    const char* name;
    const char* color;
} dog_file;

dog_file* log_dog(const dog_input* data)
{
    dog_file* df = malloc(sizeof(dog_file));
    df->name = data->name;
    df->color = data->color;
    return df;
}
#包括
#包括“DogHouse.h”
typedef结构dog_文件
{
常量字符*名称;
常量字符*颜色;
}狗牙锉;
狗文件*日志狗(常数狗输入*数据)
{
dog_文件*df=malloc(sizeof(dog_文件));
df->name=数据->名称;
df->color=数据->颜色;
返回df;
}
请注意,在函数实现中,原始函数返回一个局部变量。此版本会占用内存,但您需要导出另一个函数来释放它,否则会导致内存泄漏

输出(不透明指针实例)


argtypes中的值应该是类型。
pug
是一个实例。给定的代码不会编译,但我想到了以下内容:

pydog.py

import ctypes

srclib = ctypes.CDLL('DogHouse')

# An opaque class
class dog_file(ctypes.Structure):
   pass

# c_char_p should be used for "const char *"
class dog_input(ctypes.Structure):
    _fields_ = [
        ("name", ctypes.c_char_p),
        ("color", ctypes.c_char_p)]    

srclib.log_dog.argtypes = [ctypes.POINTER(dog_input)] # pointer type
srclib.log_dog.restype =  ctypes.POINTER(dog_file) # pointer type to opaque class

# bytes strings used for const char* (Python 3 syntax)
# create instance and pass it to function
pug = dog_input(b'doug',b'white')
print(srclib.log_dog(pug))
DogHouse.h

/* opaque handle */
typedef struct dog_file dog_file;

/* Input data structure */
typedef struct dog_input
{
    const char* name;
    const char* color;
} dog_input;

/*Logs the dog_input data into the dog_file struct */
__declspec(dllexport)
dog_file* log_dog(const dog_input* data);
DogHouse.c

#include <stdlib.h>
#include "DogHouse.h"

typedef struct dog_file
{
    const char* name;
    const char* color;
} dog_file;

dog_file* log_dog(const dog_input* data)
{
    dog_file* df = malloc(sizeof(dog_file));
    df->name = data->name;
    df->color = data->color;
    return df;
}
#包括
#包括“DogHouse.h”
typedef结构dog_文件
{
常量字符*名称;
常量字符*颜色;
}狗牙锉;
狗文件*日志狗(常数狗输入*数据)
{
dog_文件*df=malloc(sizeof(dog_文件));
df->name=数据->名称;
df->color=数据->颜色;
返回df;
}
请注意,在函数实现中,原始函数返回一个局部变量。此版本会占用内存,但您需要导出另一个函数来释放它,否则会导致内存泄漏

输出(不透明指针实例)



可能将
从ctypes导入*
更改为仅
从ctypes导入结构,指针
,因此命名空间污染更少。可能将
从ctypes导入*
更改为仅
从ctypes导入结构,指针
,因此命名空间污染更少。Mark指出了实际错误,但为了澄清,
>from_param
是ctypes调用的类方法,用于将函数参数转换为ctypes类型。将
argtypes
指定给函数指针时,它需要引用每个类型的
from_param
转换器。标准类型具有此方法的实现,可以执行一些基本转换,例如转换
None
对于指针类型,Python字符串用于
c\u char\u p
c\u wchar\u p
,整数用于
c\u int
,等等。Mark指出了实际错误,但为了澄清,
from_param
是ctypes调用的类方法,用于将函数参数转换为ctypes类型。将
argtypes
赋值给函数p时ointer,它需要从_param转换器中引用每个类型的
。标准类型具有此方法的实现,可以执行一些基本转换,例如将
None
转换为指针类型,将Python字符串转换为
c_char_p
c_wchar_p
,将整数转换为
c_int
,等等。