我有一个场景,我在C++类中有一些函数,我希望能够使用python脚本调用它们.假设我有一个功能
void greet(_msg);
std::cout >> _msg >> std::endl;
Run Code Online (Sandbox Code Playgroud)
我希望能够通过自定义Python调用来调用它并将参数传递给它,例如使用
saySomething("Hello")
Run Code Online (Sandbox Code Playgroud)
作为.py文件,我希望它调用greet函数并传递"Hello"作为参数.
我知道这是一个经过深入讨论的主题,我已经完成了在C++中嵌入python的研究,我已经设法使用标准的Python/C API从python脚本读取值并在Python中运行一个函数来自C++并将参数传递给它,但我似乎无法理解如何实现这一特定结果.
我已经看过ctypes和各种包装库,例如boost:python或swig,但我似乎无法理解他们可以帮助我实现我想要的程度.
我想开始使用boost:python将python嵌入我的C ++程序中,但是我已经遇到了以下简单代码的问题:
#include <boost/python.hpp> //boost libraries
#include <Python.h> //python libraries
using namespace boost::python;
int main()
{
Py_Initialize();
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我只是启动解释器并导入主模块,但是编译器已经遇到了问题:
/home/i7941878/Code/pythonTest/main.cpp:-1: error: undefined reference to `boost::python::detail::str_base::str_base(char const*)'
/home/i7941878/Code/pythonTest/main.cpp:-1: error: undefined reference to `boost::python::import(boost::python::str)'
/home/i7941878/Code/pythonTest/main.cpp:-1: error: undefined reference to `boost::python::api::getattr(boost::python::api::object const&, char const*)'
Run Code Online (Sandbox Code Playgroud)
我不知道为什么会出现这些错误。我很确定boost:python是正确构建的。
有人能启发我吗?
我正在使用QT Creator进行构建和编译。如果我使用G ++进行编译,-I/usr/include -I/usr/include/python2.6 main.cpp
则会得到:
/tmp/ccI8x97b.o: In function `main':
main.cpp:(.text+0xc): undefined reference to `Py_Initialize'
main.cpp:(.text+0x30): undefined reference to `boost::python::import(boost::python::str)'
/tmp/ccI8x97b.o: In function `boost::python::api::object::object()':
main.cpp:(.text._ZN5boost6python3api6objectC2Ev[_ZN5boost6python3api6objectC5Ev]+0xd): undefined …
Run Code Online (Sandbox Code Playgroud) 我觉得这是一个非常简单的问题,但我找不到合适的答案.基本上我有一个名为simulation的类调用函数列表:
simulation.addGroup("teapotarmy")
simulation.populateGroup(20)
simulation.addNode("input",INPUT)
simulation.addNode("output",OUTPUT);
simulation.connectNodes("input","output");
simulation.manipOutputNode("output", "group.xvel");
simulation.manipInputNode("input", 1, 0.05);
Run Code Online (Sandbox Code Playgroud)
有没有办法调用这些函数而不必每次都重复类名?沿线的东西:
(thethingIwant) simulation:
addGroup("teapotarmy")
populateGroup(20)
addNode("input",INPUT)
...
Run Code Online (Sandbox Code Playgroud)
我用其他编程语言完成了这个,但我还没有弄清楚Python中的语法.我有一个微弱的记忆,它与'with'声明有关...?提前致谢.
莱昂
我设法在python中使用google.cloud.datastore创建或修改数据存储实体,但是当我在浏览器中登录我的Cloud Platform项目并检查条目时,看起来它的所有属性都是加密的(它们看起来像"Rm9vIEJhcg=="
等 - 如果我从浏览器创建它,我可以正常看到).
我正在使用服务帐户标识的json文件进行身份验证:
self.client = datastore.Client()
self.client = self.client.from_service_account_json(cert_file.json)
Run Code Online (Sandbox Code Playgroud)
服务帐户对整个项目具有"编辑"权限.将其更改为"所有者",这是我用于登录的Gmail帐户的设置,但不能解决问题.
我像这样创建实体:
with self.datastore.client.transaction():
entity = Entity(Key("key", project="project"))
entity["property"] = "data"
self.datastore.client.put(entity)
Run Code Online (Sandbox Code Playgroud)
有什么方法可以使用python库修改的条目可以从浏览器站点读取吗?
python google-cloud-datastore gcloud-python google-cloud-python