我有一个C python扩展,我想打印一些诊断.
我收到一个字符串作为PyObject*.
获取此对象的字符串rep的规范方法是什么,这样它可以用作const char*?
更新:澄清以强调访问为const char*.
我想检查PyObject
一下我是否有None
.我天真地期望None
Pyobject *
从函数返回的任何东西都是NULL指针,但似乎并非如此.
那么:我如何检查我的一个是否PyObject *
指向一个None
物体?
我知道有像PyInt_Check(PyObject *)
周围的宏,但我找不到类似的东西PyNone_Check
.我以为我可以检查我PyObject
和之间的平等Py_None
,但事实证明我甚至不知道如何与这个库进行相等比较.
我正在通过Python运行C ++代码,并希望选择一个扩展类型。
因此,我有一个C ++结构(py_db_manager),其中包含指向数据库对象的指针和一个对象管理器对象(均以C ++编写),并用python类型的对象(t_db_manager)包装。我的问题是,此python类型需要知道如何腌制两个指针才能将其发送给某些子多核进程。因此,我在copy_reg模块中注册了该类型(这相当于在该类型上编写一个reduce()方法。但是,我不太确定要在其中添加什么。应该使用PyObject *还是仅使用整数指针?有人可以帮忙吗?
typedef struct
{
PyObject_HEAD
PyObject* man_inst_ ;
PyObject* db_inst_ ;
}py_db_manager;`
Run Code Online (Sandbox Code Playgroud)
这是Py_TypeObject
PyTypeObject t_db_manager = {
PyObject_HEAD_INIT(0) /* tp_head */
0, /* tp_internal */
".py_db_manager", /* tp_name */
sizeof(py_db_manager)};
Run Code Online (Sandbox Code Playgroud)
这是reduce方法中的代码:
PyObject *pickle_manager(PyObject *module, PyObject *args)
{
py_db_manager *cpp_manager =0;
PyObject *values = NULL,
*tuple = NULL;
char text[512];
if (!PyArg_ParseTuple(args, "O!", &t_db_manager, &cpp_manager))
goto error;
sprintf(text,"man_inst_, db_inst_");
if ((values = Py_BuildValue("(sii)", text,
cpp_manager->man_inst_, cpp_manager->db_inst_)) == NULL)
goto error;
tuple = …
Run Code Online (Sandbox Code Playgroud) 在C / C ++中,我想查看a PyObject
是否是实例。不幸的是,该PyInstance_Check
宏不适用于新型类。
因此,根据我阅读的论坛帖子,PyObject_IsInstance
可以解决此问题。但是,我发现的所有示例都演示了与内置类型(例如int和字符串)的比较。
我想知道如何构造一个表示类型的类的PyObject,因此可以将其传递给的第二个参数PyObject_IsInstance
。你能帮助我吗?
在Julia,我正在调用Python模块pandas_datareader来从Web下载数据:
using PyCall
@pyimport datetime
@pyimport pandas_datareader.data as web
gdp = web.DataReader("GDPCA","fred",start=datetime.datetime(1929,1,1))
Run Code Online (Sandbox Code Playgroud)
变量gdp是PyObject对象.因此,我无法操纵它(以日志为例).如何将其转换为数组?我试过转换(Array {Float64,2},gdp),但它只会崩溃朱莉娅.
谢谢!
我正在用 C++ 编写 Python 3 扩展,并且正在尝试找到一种方法来检查 a 是否PyObject
与定义其实例布局的类型(结构)相关。我只对 static-size 感兴趣PyObject
,而不是PyVarObject
. 实例布局由具有某些明确定义的布局的结构体定义:强制PyObject
标头和(可选)用户定义的成员。
下面是基于定义新类型中PyObject
著名的 Noddy 示例的扩展示例:
// Noddy struct specifies PyObject instance layout
struct Noddy {
PyObject_HEAD
int number;
};
// type object corresponding to Noddy instance layout
PyTypeObject NoddyType = {
PyObject_HEAD_INIT(NULL)
0, /*ob_size*/
"noddy.Noddy", /*tp_name*/
sizeof(Noddy), /*tp_basicsize*/
0, /*tp_itemsize*/
...
Noddy_new, /* tp_new */
};
Run Code Online (Sandbox Code Playgroud)
值得注意的是,它Noddy
是一种类型、一个编译时实体,但NoddyType
它是运行时存在于内存中的一个对象。Noddy
和之间唯一明显的关系NoddyType
似乎是sizeof(Noddy)
存储在tp_basicsize
成员中的值。
在 …
我想用来Py_BuildValue()
在C中创建一个元组列表.
我想要构建的内容如下所示:
[ (...), (...), ... ]
Run Code Online (Sandbox Code Playgroud)
我不知道在编译时创建的元组数量,所以我不能在这里使用一些静态数量.
Py_BuildValue()
这里基本上使用一个元组是代码的样子:
PyObject * Py_BuildValue("[(siis)]", name, num1, num2, summary);
Run Code Online (Sandbox Code Playgroud)
但那只会是一个元组.我需要在列表中有多个元组,我可以通过for循环添加.我怎么能做到这一点?
到目前为止,我使用此代码的变体来打印我用pisa创建的pdf.
这取自pygtk faq:
import gtk
import gtkunixprint
def print_cb(printjob, data, errormsg):
if errormsg:
print('Error occurred while printing:\n%s' % errormsg)
filename = 'the_pdf_file_to_be_printed.pdf'
pud = gtkunixprint.PrintUnixDialog()
response = pud.run()
if response == gtk.RESPONSE_OK:
printer = pud.get_selected_printer()
settings = pud.get_settings()
setup = pud.get_page_setup()
printjob = gtkunixprint.PrintJob('Printing %s' % filename, printer, settings, setup)
printjob.set_source_file(filename)
printjob.send(print_cb)
pud.destroy()
Run Code Online (Sandbox Code Playgroud)
现在我移植到Gtk3 PyObject,我无法解决问题.我发现Gtk.PrintOperation是方式,但我不能将打印操作与printJob或如何传递文件进行打印相关联.
谢谢
我们正在尝试将这个程序从 gtk2 移植到 gtk3。当我尝试时pygi-convert.sh
,出现以下错误:
Traceback (most recent call last):
File "scripts/amir", line 53, in <module>
from gi.repository import GObject
File "/usr/lib/python2.7/dist-packages/gi/__init__.py", line 39, in <module>
raise ImportError(_static_binding_error)
ImportError: When using gi.repository you must not import static modules like "gobject". Please change all occurrences of "import gobject" to "from gi.repository import GObject". See: https://bugzilla.gnome.org/show_bug.cgi?id=709183
Run Code Online (Sandbox Code Playgroud)
任何建议或其他方式来做这个端口?
我正在尝试使用 C API 构建 Python 字典,但似乎不可能(Py_BuildValue 返回 NULL 对象)使用 PyObject* 作为值。我有这样的情况:
#include <python3.5/Python.h>
...
PyObject *myList = PyList_New(1);
PyList_SetItem(myList, 0, Py_BuildValue("i", 1));
dict = Py_BuildValue("{siso}",
"anInt", myInt,
"aList", mylist);
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种适用于列表通用大小的解决方案。我在官方文档中没有找到任何有关此内容的信息,并且还用谷歌搜索了几个小时。有人可以帮助我吗?提前致谢
我有一个A
像这样的python类.
class A:
def __init__(self, name):
self.name = name
def print_lastname(self, lastname):
print(lastname)
Run Code Online (Sandbox Code Playgroud)
我必须像这样调用这个代码.
import B
a = B.A("hello")
a.print_lastname("John")
Run Code Online (Sandbox Code Playgroud)
目前,我需要A
从我的C++代码中使用这个类.我到目前为止.
Py_Initialize();
string hello = "hello";
PyObject *module, *attr, *arg;
module = PyObject_ImportModule("B"); // import B
attr = PyObject_GetAttrString(module, "A"); // get A from B
arg = PyString_FromString(hello.c_str());
instance = PyInstance_New(attr, arg, NULL); // trying to get instance of A with parameter "hello"
Py_Finalize();
Run Code Online (Sandbox Code Playgroud)
但我收到了错误
异常TypeError:来自'/usr/lib64/python2.7/threading.pyc'的模块'threading'中的'参数列表必须是元组'
如何从C import
语句到a.print_name("John")
C++实现?任何帮助表示赞赏.
我创建了用C++编写的DLL,导出函数返回PyObject*.然后我使用ctypes在Python中导入DLL.现在,我怎样才能得到真正的PyObject?
这是c ++代码的一部分:
PyObject* _stdcall getList(){
PyObject * PList = NULL;
PyObject * PItem = NULL;
PList = PyList_New(10);
vector <int> intVector;
int i;
for(int i=0;i<10;i++){
intVector.push_back(i);
}
for(vector<int>::const_iterator it=intVector.begin();it<intVector.end();it++){
PItem = Py_BuildValue("i", &it);
PyList_Append(PList, PItem);
}
return PList;
}
Run Code Online (Sandbox Code Playgroud)
和一些python代码:
dll = ctypes.windll.LoadLibrary(DllPath)
PList = dll.getList()
Run Code Online (Sandbox Code Playgroud)
*我想获得包含1,2,3,4 ... 10的真正的python列表?* 我是否清楚?谢谢你