我在嵌入Python(2.7.1)的C应用程序中有这个代码:
{
PyObject *user_dict;
PyObject *user_func;
PyObject *result;
PyObject *header_tuple;
PyObject *original_recipients;
PyObject *working_recipients;
if (!Py_IsInitialized())
{
Py_Initialize();
}
if (!expy_exim_dict)
{
PyObject *module = Py_InitModule(expy_exim_module, expy_exim_methods); /* Borrowed reference */
Py_INCREF(module); /* convert to New reference */
expy_exim_dict = PyModule_GetDict(module); /* Borrowed reference */
Py_INCREF(expy_exim_dict); /* convert to New reference */
}
if (!expy_user_module)
{
if (expy_path_add)
{
PyObject *sys_module;
PyObject *sys_dict;
PyObject *sys_path;
PyObject *add_value;
sys_module = PyImport_ImportModule("sys"); /* New Reference */
if (!sys_module)
{
PyErr_Clear();
*return_text = …Run Code Online (Sandbox Code Playgroud) 这个错误报告指出,截至2007年6月,Python解释器在使用嵌入式Python解释器在C/C++应用程序中调用Py_Finalize之后不会清理所有已分配的内存.建议在应用程序终止时调用Py_Finalize一次.
此错误报告指出,从版本3.3和2011年3月开始,解释器仍会泄漏内存.
有谁知道这个问题的当前状态?我担心因为我有一个应用程序,每个运行实例多次调用解释器,我遇到内存泄漏.
我已经使用boost :: python来处理引用计数,并清除了在运行之间运行Python程序所创建的所有引用的全局字典.我有一些单身人士课 - 这可能是问题吗?
这是一个易处理的问题还是Python解释器中的错误?
我编写了一个嵌入Python的小程序.我正在使用Py_Initialize()和Py_Finalize()正确设置它,并且能够使用PyRun_SimpleString或PyRun_SimpleFile运行脚本.但是,我不知道在打印变量时如何模仿Python自己的解释器的行为.
特别:
a = (1, 2, 3)
print a
Run Code Online (Sandbox Code Playgroud)
适合我的工作:打印出来(1,2,3)
然而:
a = (1, 2, 3)
a
Run Code Online (Sandbox Code Playgroud)
什么都没有打印出来.在Python自己的解释器中,这也会打印出(1,2,3).如何让我的代码执行用户期望的操作并打印出值?
提前致谢!
当我运行时pResult = PyObject_CallFunction(pFunc, "s", &"String"),python 脚本返回正确的字符串。但是,如果我尝试运行这个:
std::string passedString = "String";
pResult = PyObject_CallFunction(pFunc, "s", &passedString)
Run Code Online (Sandbox Code Playgroud)
然后将 pResult 转换为 a std::string,我<NULL>在打印时得到。这是一些(可能)完整的返回代码<NULL>:
C++代码:
#include <Python.h>
#include <string>
#include <iostream>
int main()
{
PyObject *pName, *pModule, *pDict, *pFunc;
// Set PYTHONPATH TO working directory
setenv("PYTHONPATH",".",1); //This doesn't help
setenv("PYTHONDONTWRITEBYTECODE", " ", 1);
// Initialize the Python Interpreter
Py_Initialize();
// Build the name object
pName = PyUnicode_FromString((char*)"string");
// Load the module object
pModule = PyImport_Import(pName);
// pDict …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 .NET 示例中运行 Embedding Python https://github.com/pythonnet/pythonnet。我已经按照故障排除文章将正确的 %PYTHONPATH% 和 %PYTHONHOME% 设置为程序基目录中的 anaconda 环境。
激活我的 anaconda 环境后,我已经成功导入了 sys 和 imp 作为测试,并且还成功地使用了 PythonEngine.RunSimpleString(),但是 numpy 示例失败了 Python.Runtime.PythonException: ImportError : No module named 'numpy'
在这个环境下从python导入numpy是成功的,但是这个包和其他包在pythonnet中导入失败。
Pythonnet 版本:2.3 x64(使用conda install -c pythonnet pythonnet 安装)
Python 版本:Python 3.5 x64 (anaconda)
操作系统:Windows 10
以下代码产生错误:
static void Main(string[] args)
{
string envPythonHome = AppDomain.CurrentDomain.BaseDirectory + "cntk-py35";
string envPythonLib = envPythonHome + @"\Lib";
Environment.SetEnvironmentVariable("PYTHONHOME", envPythonHome, EnvironmentVariableTarget.Process);
Environment.SetEnvironmentVariable("PATH", envPythonHome + ";" + Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Machine), EnvironmentVariableTarget.Process);
Environment.SetEnvironmentVariable("PYTHONPATH", envPythonLib, EnvironmentVariableTarget.Process); …Run Code Online (Sandbox Code Playgroud) 我在 ubuntu 20.04 中使用嵌入式 Python (3.9) 并尝试导入产生错误的 ctypes _ctypes.cpython-39-x86_64-linux-gnu.so: undefined symbol: PyFloat_Type。
我正在编译一个共享对象,它是使用 动态加载的dlopen()。
CMake用于构建共享对象。我像这样声明 Python3 依赖关系:
find_package(Python3 REQUIRED COMPONENTS Development Development.Embed)并使用链接target_link_libraries(${target_name} Boost::filesystem Python3::Python)
如果我理解正确,这会告诉 CMake 直接链接到libpython3.9.so(我也尝试明确声明链接到libpython3.9.so,但这并没有解决问题)。我确实看到libpython3.9.so有出口PyFloat_Type,但_ctypes.cpython-39-x86_64-linux-gnu.so没有看到。
导入只需通过以下PyRun_SimpleString()函数即可完成:PyRun_SimpleString("import ctypes")。
我应该声明,我在网上看到了一些解决方案,但没有一个有效(例如导出LD_FLAGS="-rdynamic",但也没有帮助)。
我还应该指出,使用解释器(python3.9)导入效果很好。
以下是 CMake 生成的构建命令:
/usr/bin/c++ -fPIC -g -Xlinker -export-dynamic -shared -Wl,-soname,mytest.python3.so -o mytest.python3.so CMakeFiles/mytest.python3.dir/[mydir]/[myobjects].o /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.71.0 /usr/lib/x86_64-linux-gnu/libpython3.9.so /usr/lib/x86_64-linux-gnu/libpython3.9.so
感谢您提前提供任何帮助!
我正在尝试使用C API加载一个包含C中的数学和numpy导入的python模块.我可以加载并运行模块但是,如果我导入数学模块它不起作用.
我使用的是Arch Linux,Python 2.7.2和gcc.
这里的代码:
#include <stdio.h>
#include <stdlib.h>
#include <python2.7/Python.h>
int main(int argc, char **argv)
{
PyObject *pName, *pModule, *pFunc, *pArg, *pDict, *pReturn, *pT1, *pT2, *pX, *pY;
int i;
double x, y;
Py_Initialize();
PySys_SetPath(".");
pName = PyString_FromString("func");
if (!pName)
{
printf("pName\n");
return 0;
}
pModule = PyImport_Import(pName);
pDict = PyModule_GetDict(pModule);
pFunc = PyDict_GetItemString(pDict, "get_vals");
pArg = PyTuple_New(2);
PyTuple_SetItem(pArg, 0, PyFloat_FromDouble(4.0));
PyTuple_SetItem(pArg, 1, PyFloat_FromDouble(2.0));
pReturn = PyObject_CallObject(pFunc, pArg);
pT1 = PyTuple_GetItem(pReturn, 0);
pT2 = PyTuple_GetItem(pReturn, 1);
for (i = …Run Code Online (Sandbox Code Playgroud) 我正在尝试用C语言编写一个演示PAM模块,该模块使用在C概念中嵌入Python来运行以python(2.7)编写的脚本,该脚本位于pam_sm_authenticate()函数内部,该函数以C文件(pam_auth.c)编写。
这是python脚本:test.py
import math
import numpy
def test_func():
a = "test"
return a
Run Code Online (Sandbox Code Playgroud)
test.py的路径是/usr/lib/Python2.7/,以便我可以轻松导入它。
这是C文件:
#define PAM_SM_AUTH
#define PAM_SM_ACCOUNT
#define PAM_SM_SESSION
#include <security/pam_modules.h>
#include <security/_pam_macros.h>
#include <security/pam_appl.h>
#include<python2.7/Python.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NOBODY "nobody"
/*PAM Stuffs*/
PAM_EXTERN int pam_sm_authenticate(
pam_handle_t* pamh, int flags, int argc, const char** argv)
{
const char *user;
int retval;
user = NULL;
retval = pam_get_user(pamh, &user, NULL);
if(retval != PAM_SUCCESS)
{
fprintf(stderr, "%s", pam_strerror(pamh, retval));
// return (retval);
}
fprintf(stdout, "retval= %d user=%s\n", retval,user);
if …Run Code Online (Sandbox Code Playgroud) 我有一个 python 脚本,我需要调用很多次(大约 160000 次),虽然我可以使用硬 C++ 代码在不到一秒的时间内完成此操作,但如果我尝试加载并调用 python 脚本来执行此操作,它将可能需要几个小时!我认为如果我加载脚本一次,然后一遍又一遍地运行加载的脚本,速度会明显加快。不幸的是,我不知道该怎么做。我认为我无法使用 加载文件ifstream,然后PyRun_SimpleString在字符串的所有行上使用。但是,如果速度不快,是否可以在 python 中返回一个 2D 数组,然后将该数组转换为std::vector?
你有什么建议我的应用程序的脚本需求构建一个非常简约的Python(2.x)版本的建议.
我的主要动机是尽可能降低脚印(内存和磁盘方式),以便我的原生应用程序不会遭受任何重大性能损失.甚至考虑Python DLL大小也是因为可能会增加应用程序的启动时间.
我们可以像Lua或其他轻量级解决方案一样低吗?
我有一个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++实现?任何帮助表示赞赏.
在 PyTorch 中,torch.nn.function.embedding_bag 似乎是负责执行嵌入查找的实际工作的主要函数。在 PyTorch 的文档中,提到 embedding_bag 可以完成其工作 > 无需实例化中间嵌入。这究竟意味着什么?这是否意味着例如当模式为“sum”时它会进行就地求和?或者它只是意味着在调用 embedding_bag 时不会产生额外的张量,但仍然从系统的角度来看,所有中间行向量已经被提取到处理器中以用于计算最终张量?
python-embedding ×12
python ×9
c ×4
python-c-api ×4
c++ ×3
embedding ×2
anaconda ×1
c# ×1
ctypes ×1
interpreter ×1
numpy ×1
pam ×1
pyobject ×1
python-2.7 ×1
python-3.5 ×1
python.net ×1
pytorch ×1
scripting ×1
torch ×1
tuples ×1
ubuntu ×1