【问题标题】:Embedded python in c++ on raspberry pi在树莓派上的 C++ 中嵌入 python
【发布时间】:2015-08-05 03:37:02
【问题描述】:

在我询问如何在 python 中调用 c++ 之前,但这对我来说相当困难。后来我发现如果在 c++ 中调用 python 似乎更容易。在关注the tutorial on codeproject时,我在编译时遇到了以下问题。

"pi@raspberrypi ~/New $ g++ led.cpp"

led.cpp:3:20: fatal error: Python.h: No such file or directory
compilation terminated.

我整天都在寻找解决方案。我尝试了sudo apt-get install python-dev(甚至是其他版本,例如 2.7、3.2 等),但一切都已经完全安装,仍然出现错误。我可以通过树莓派的查找功能找到 Python.h 的位置。

最后我在某个网站上找到了以下解决方案:

pi@raspberrypi ~/New $ g++ $(python-config --includes) led.cpp

Python.h 致命错误已解除,出现以下错误。

/tmp/ccSIJpeH.o: In function `main':
led.cpp:(.text+0x30): undefined reference to `Py_Initialize'
led.cpp:(.text+0x44): undefined reference to `PyString_FromString'
led.cpp:(.text+0x54): undefined reference to `PyImport_Import'
led.cpp:(.text+0x64): undefined reference to `PyModule_GetDict'
led.cpp:(.text+0x84): undefined reference to `PyDict_GetItemString'
led.cpp:(.text+0x94): undefined reference to `PyCallable_Check'
led.cpp:(.text+0xbc): undefined reference to `PyObject_CallObject'
led.cpp:(.text+0xc4): undefined reference to `PyErr_Print'
led.cpp:(.text+0x158): undefined reference to `Py_Finalize'
collect2: ld returned 1 exit status

请告诉我如何解决这个问题!

附录:谢谢 Nitori 回答我的问题。我现在可以编译了。编译后,它创建了一个“a.out”文件,但是当我运行它时它什么也没做......

这是led.cpp的代码

// python functions from C code
// 
#include <Python.h>

int main(int argc, char *argv[])
{
    PyObject *pName, *pModule, *pDict, *pFunc, *pValue;

    if (argc < 3) 
    {
        printf("Usage: exe_name python_source function_name\n");
        return 1;
    }

    // Initialize the Python Interpreter
    Py_Initialize();

    // Build the name object
    pName = PyString_FromString(argv[1]);

    // Load the module object
    pModule = PyImport_Import(pName);

    // pDict is a borrowed reference 
    pDict = PyModule_GetDict(pModule);

    // pFunc is also a borrowed reference 
    pFunc = PyDict_GetItemString(pDict, argv[2]);

    if (PyCallable_Check(pFunc)) 
    {
        PyObject_CallObject(pFunc, NULL);
    } else 
    {
        PyErr_Print();
    }

    // Clean up
    Py_DECREF(pModule);
    Py_DECREF(pName);

    // Finish the Python Interpreter
    Py_Finalize();

    return 0;
}

这是我要调用的 python 代码。 led.py

import RPi.GPIO as GPIO
import time

def ledopen():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(17, GPIO.OUT)
    GPIO.setup(27, GPIO.OUT)
    GPIO.setup(22, GPIO.OUT)
    GPIO.setup(18, GPIO.OUT)
    GPIO.setup(23, GPIO.OUT)
    GPIO.setup(24, GPIO.OUT)

    GPIO.output(27, True)
    GPIO.output(22, True)
    GPIO.output(18, True)
    GPIO.output(23, True)
    GPIO.output(24, True)
    GPIO.output(17, True)

    time.sleep(5)

    GPIO.output(27, False)
    GPIO.output(22, False)
    GPIO.output(18, False)
    GPIO.output(23, False)
    GPIO.output(24, False)
    GPIO.output(17, False)

    GPIO.cleanup()
    return
ledopen()

我通过输入“sudo ./a.out led led ledopen”来调用程序。它什么也没做。

【问题讨论】:

  • 如果您还有其他问题,请点击 按钮进行提问。将您的问题保留为每个问题一个问题。

标签: python c++ raspberry-pi python-embedding


【解决方案1】:

您还需要链接到 Python。对于您的编译方式,它应该可以工作:g++ $(python-config --includes --libs) led.cpp

【讨论】:

  • 非常感谢!现在我可以编译它了!但是其他问题来了哈哈。
猜你喜欢
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
相关资源
最近更新 更多