标签: python-embedding

如何通过PyImportModule找出导入失败的原因?

我在嵌入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)

python python-embedding python-c-api

4
推荐指数
1
解决办法
2807
查看次数

嵌入时Python 3解释器是否会泄漏内存?

这个错误报告指出,截至2007年6月,Python解释器在使用嵌入式Python解释器在C/C++应用程序中调用Py_Finalize之后不会清理所有已分配的内存.建议在应用程序终止时调用Py_Finalize一次.

此错误报告指出,从版本3.3和2011年3月开始,解释器仍会泄漏内存.

有谁知道这个问题的当前状态?我担心因为我有一个应用程序,每个运行实例多次调用解释器,我遇到内存泄漏.

我已经使用boost :: python来处理引用计数,并清除了在运行之间运行Python程序所创建的所有引用的全局字典.我有一些单身人士课 - 这可能是问题吗?

这是一个易处理的问题还是Python解释器中的错误?

c python embedding python-embedding python-c-api

4
推荐指数
1
解决办法
1772
查看次数

在嵌入式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).如何让我的代码执行用户期望的操作并打印出值?

提前致谢!

c python interpreter python-embedding python-c-api

4
推荐指数
1
解决办法
1676
查看次数

将 std::string 传递到 PyObject_CallFunction

当我运行时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)

c++ python python-embedding

4
推荐指数
1
解决办法
4255
查看次数

pythonnet 在 .net 示例中嵌入 Python 未能加载模块

我正在尝试在 .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)

c# python-embedding python.net anaconda python-3.5

4
推荐指数
2
解决办法
5503
查看次数

_ctypes.cpython-39-x86_64-linux-gnu.so:未定义符号:使用 dlopen 加载的嵌入式 Python 中的 PyFloat_Type

我在 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

感谢您提前提供任何帮助!

python ubuntu ctypes python-embedding

4
推荐指数
1
解决办法
7855
查看次数

Python C API不加载模块

我正在尝试使用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 python python-embedding python-c-api

3
推荐指数
1
解决办法
3947
查看次数

将Python脚本嵌入C中的PAM模块(.so文件)时,ImportError和PyExc_SystemError

我正在尝试用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)

c numpy pam python-embedding python-2.7

3
推荐指数
1
解决办法
1566
查看次数

从 C++ 调用 python 脚本,无需每次加载文件

我有一个 python 脚本,我需要调用很多次(大约 160000 次),虽然我可以使用硬 C++ 代码在不到一秒的时间内完成此操作,但如果我尝试加载并调用 python 脚本来执行此操作,它将可能需要几个小时!我认为如果我加载脚本一次,然后一遍又一遍地运行加载的脚本,速度会明显加快。不幸的是,我不知道该怎么做。我认为我无法使用 加载文件ifstream,然后PyRun_SimpleString在字符串的所有行上使用。但是,如果速度不快,是否可以在 python 中返回一个 2D 数组,然后将该数组转换为std::vector

c++ python python-embedding

3
推荐指数
1
解决办法
900
查看次数

为我的应用程序的脚本需求构建最小的Python?

你有什么建议我的应用程序的脚本需求构建一个非常简约的Python(2.x)版本的建议.

我的主要动机是尽可能降低脚印(内存和磁盘方式),以便我的原生应用程序不会遭受任何重大性能损失.甚至考虑Python DLL大小也是因为可能会增加应用程序的启动时间.

我们可以像Lua或其他轻量级解决方案一样低吗?

python scripting python-embedding

2
推荐指数
1
解决办法
1325
查看次数

使用C++,PyObject中的参数创建Python构造函数

我有一个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++ python tuples python-embedding pyobject

2
推荐指数
1
解决办法
558
查看次数

embedding_bag 在 PyTorch 中的具体工作原理

在 PyTorch 中,torch.nn.function.embedding_bag 似乎是负责执行嵌入查找的实际工作的主要函数。在 PyTorch 的文档中,提到 embedding_bag 可以完成其工作 > 无需实例化中间嵌入。这究竟意味着什么?这是否意味着例如当模式为“sum”时它会进行就地求和?或者它只是意味着在调用 embedding_bag 时不会产生额外的张量,但仍然从系统的角度来看,所有中间行向量已经被提取到处理器中以用于计算最终张量?

embedding python-embedding neural-network torch pytorch

1
推荐指数
1
解决办法
4465
查看次数