ubuntu에서는 Qt 플랫폼 기반으로 python 파일을 호출하고 이를 임베디드 리눅스 개발보드에 크로스 컴파일하여 실행합니다.

1. 간략한 소개

1.1 명확한 목표

임베디드 Linux 개발 보드에서 실행해야 하기 때문에 x86_64 플랫폼 파일은 크로스 컴파일을 통해 arm 아키텍처 파일로 크로스 컴파일되어야 합니다. 여기서 가장 중요한 것은 Python 소스 코드와 해당 종속 라이브러리를 크로스 컴파일한 다음 우분투의 QT 플랫폼에서 크로스 컴파일하여 Python 언어를 사용하고 임베디드 Linux 플랫폼에서 실행할 수 있는 실행 파일을 빌드하는 것입니다.

1.2 Python 버전 및 배경

  1. 크로스 컴파일 도구 체인: gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf
  2. 우분투 플랫폼: ubuntu18.04.1 64비트
  3. 파이썬 버전: python3.6.9
  4. 임베디드 Linux 개발 보드 커널: NXP CORTEX-A7 IMX6ULL

1.3 단계

  1. 먼저 Python 소스 코드와 해당 종속 라이브러리를 교차 컴파일합니다.
  2. Linux 개발 보드로 포팅됨
  3. 우분투의 Qt 플랫폼에서 데모 검증 작성

2. Python 소스 코드와 해당 종속 라이브러리를 크로스 컴파일합니다.

2.1 컴파일 단계

  1. 대부분의 다른 라이브러리에서 사용될 가능성이 있는 openssl 라이브러리를 크로스 컴파일합니다.
  2. Python 소스 코드 설치에 필요한 종속 라이브러리인 zlib 라이브러리를 크로스 컴파일합니다.
  3. 크로스 컴파일 libffi 라이브러리
  4. Python 소스 코드 크로스 컴파일.
    다음은 Baidu 네트워크 디스크 링크입니다. 공식 웹사이트에서 관련 라이브러리를 다운로드하거나 여기에서 직접 얻을 수 있습니다:
    링크: https://pan.baidu.com/s/1mui3Vw8FfxnMUFSjFZhItA
    추출 코드: pwev

2.2 openssl 크로스 컴파일

  1. openssl을 다운로드하세요( https://www.openssl.org/source/ ). 여기서 사용하는 버전은 openssl1.1.1입니다.
    (참고: 관리의 편의를 위해 다운로드한 모든 소스코드는 /home/book/pyarm/zlibarm/에 위치합니다.)
  2. 압축 풀기: tar -xzvf openssl-1.1.1.tar.gz
  3. CD openssl-1.1.1
  4. 컴파일 환경 구성: ./Configure no-asm shared no-async linux-generic32 --prefix=/home/book/pyarm/opensslarm --cross-compile-prefix=arm-linux-gnueabihf- no-asm in the cross -컴파일
    프로세스 어셈블리 코드는 컴파일 프로세스 속도를 높이는 데 사용되지 않으며
    공유는 동적 링크 라이브러리를 생성합니다.
    no-async 크로스 컴파일 툴 체인은 GNU C ucontext 라이브러리
    –prefix= 설치 경로를 제공하지 않습니다. (make 및 make 설치 후 openssl 관련 include 및 lib 파일이 이 디렉터리에 있습니다. 설치 디렉터리는 직접 선택할 수 있습니다.) –cross-
    compile -prefix= 크로스 컴파일 도구
    linux-generic32는 32비트 운영 체제로 크로스 컴파일을 의미합니다.
  5. 만들다
  6. 설치하다

2.3 zlib 크로스 컴파일

  1. zlib( http://zlib.net/) 을 다운로드합니다 . 여기서 사용하는 버전은 1.2.11입니다.
  2. 압축 풀기: tar -xzvf zlib-1.2.11.tar.gz
  3. CD zlib-1.2.11
  4. 컴파일러 설정: import CC=arm-linux-gnueabihf-gcc (zlib의 구성에는 컴파일러를 구성하는 옵션이 없으므로 여기서 환경 변수를 설정하십시오)
  5. 컴파일 환경 구성: ./configure --prefix=/home/book/pyarm/zlibarm --enable-shared
  6. 만들다
  7. 설치하다

2.4 libffi 크로스 컴파일

  1. libffi를 다운로드하세요( https://sourceware.org/libffi/ ). 여기서 사용하는 버전은 3.2.1입니다.
  2. 압축 풀기: tar xvzf libffi-3.2.1.tar.gz
  3. CD libffi-3.2.1
  4. 配置编译环境:./configure CC=arm-linux-gnueabihf-gcc --host=arm-linux-gnueabihf --build=x86_64-linux-gnu target=arm-linux-gnueabihf --enable-shared --prefix= /home/book/pyarm/libffiam
  5. 만들다
  6. 설치하다

2.5 파이썬 크로스 컴파일

  1. Python( https://www.python.org/downloads/source/ )을 다운로드하세요 . 여기서 사용하는 버전은 3.6.9입니다.

  2. 압축 풀기: tar xvf Python-3.6.9.tgz

  3. CD Python-3.6.9

  4. mkdir /home/book/arm-python (파이썬 컴파일은 위 라이브러리에 의존하기 때문에 여기에 디렉터리를 추가하면 위에서 컴파일한 include와 lib가 이 디렉터리로 이동됩니다)

  5. 위에서 컴파일한 관련 라이브러리의 헤더 파일과 링크 라이브러리를 /home/book/arm-python cp -rfp /
    home/book/pyarm/zlibarm/* /home/book/arm-python cp
    -rfp /home/ book 에 복사합니다. /pyarm/libffiam/* /home/book/arm-python
    cp -rfp /home/book/pyarm/opensslarm/* /home/book/arm-python

  6. CFLAGS:CFLAGS="-I /home/book/arm-python -I /home/book/arm-python/include/python3.6m -L /home/book/arm-python/lib"

  7. LDFLAGS 설정: LDFLAGS="-L /home/book/arm-python/lib"

  8. vi Modules/Setup.dist, 내부에 있는 관련 라이브러리의 헤더 파일과 라이브러리 파일을 수정합니다.
    여기에 이미지 설명을 삽입하세요.
    여기에 이미지 설명을 삽입하세요.

    참고: 위 그림에서 볼 수 있듯이 우리가 설정한 라이브러리의 경로는 절대 경로이므로 나중에 컴파일된 파일을 개발보드에 패키징할 때 /home/book/arm-python에도 배치해야 합니다. 개발 보드의 디렉터리(그렇지 않으면 직접 만들 수 있습니다.)
    (이유는 Python 가상 환경이 Python 컴파일러의 절대 경로를 기록하므로 다른 호스트에서 Python 가상 환경을 실행할 때 가상 환경이 이 절대 경로에서 여전히 Python 컴파일러를 찾습니다. 따라서 개발 보드에 동일한 디렉터리를 생성해야 합니다. 그렇지 않으면 찾을 수 없는 파일 및 모듈과 같은 오류가 발생합니다)

  9. ./configure CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ AR=arm-linux-gnueabihf-ar RANLIB=arm-linux-gnueabihf-ranlib --host=arm-linux-gnueabihf -- 빌드=x86_64-linux-gnu --target=arm-linux-gnueabihf --disable-ipv6 ac_cv_file__dev_ptmx=yes ac_cv_file__dev_ptc=yes --prefix=/home/book/arm-python --enable-shared --without-ensurepip

  10. 만들다

  11. 설치하다

3. 리눅스 개발보드로 이식

  1. arm-python 디렉터리를 압축합니다. cd /home/book tar cvf arm-python.tar arm-python
  2. FileZilla와 같은 도구를 통해 arm-python.tar를 개발 보드의 /home/book 디렉터리로 전송합니다.
  3. 압축 풀기: tar xvf arm-python.tar
    요약: 위 단계를 수행한 후 Python 이식이 완료되었습니다. 여기에서 cd ​​/home/book/arm-python/bin을 입력한 다음 ./python3을 입력하여 Python 인터페이스 프로그래밍에 들어갈 수도 있습니다. , 그리고 종료()를 사용하여 종료합니다. Python 인터페이스, 명령줄로 돌아갑니다.

4. 우분투 Qt 플랫폼에서 데모 검증 작성

  1. Qt에서 새 프로젝트 만들기------여기서 선택한 템플릿은 Application(Qt)------이름: py_test이고 생성 경로는 /home/book/QT/my_qt/qt_python---- -뒤에 여러 단계가 기본값으로 설정되어 있습니다 -----마지막으로 크로스 컴파일 도구 체인을 확인합니다----완료되었습니다.
  2. 새 파일 만들기 - Python, Python 파일 선택 ----이름: test_pyfile.py, 경로는 수정할 필요가 없습니다---완전합니다. (생성 후 프로젝트의 다른 파일에서 test_pyfile.py 파일을 볼 수 있습니다)
  3. test_pyfile.py 파일에 다음 코드를 추가합니다. (주 함수는 매개변수 a를 통해 문자열을 전달한 다음 연결된 문자열 b를 반환하는 것입니다.)
def testpyfile(a):
    b = a+'jiayou'
    return b
# 这里必须空两行:
# python编码规范:类与类,类与函数,函数与函数之间空两行)
print(testpyfile("111"))
  1. .pro 파일에서 Python 관련 라이브러리 파일과 헤더 파일을 가져옵니다.
INCLUDEPATH += \
               -I /home/book/arm-python/include/python3.6m/ \
               -I /home/book/arm-python/include  \
               -I /home/book/arm-python/include/openssl

LIBS += \
        -L /home/book/arm-python/lib/ -lpython3.6m  \
        -L /home/book/arm-python/lib/ -lssl   \
        -L /home/book/arm-python/lib/ -lcrypto   \
        -L /home/book/arm-python/lib/ -lz   \
  1. 기본 함수에 다음 코드를 추가합니다.
#include "mainwindow.h"

#include <QApplication>

#include "Python.h"   //引入python头文件
#include <QDebug>

int main(int argc, char *argv[])
{
    
    
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    Py_Initialize();   // 初始化Python

    PyObject *pModule = nullptr;
    PyObject *pLoadFunc = nullptr;
    PyObject *pArgs = nullptr;
    PyObject *pReturn = nullptr;
    PyObject *str = nullptr;

    const char *bytes = nullptr;

    if(!Py_IsInitialized())
    {
    
    
        qDebug()<<"inititalize failed";
        return -1;
    }
    else
        qDebug()<<"inititalize success";

    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('/home/book/QT/my_qt/qt_python/py_test')");

    pModule = PyImport_ImportModule("test_pyfile");
    if(!pModule)
    {
    
    
        PyErr_Print();
        qDebug()<<"not loaded module";
        return -1;
    }
    else
        qDebug()<<"load module success";

    pLoadFunc = PyObject_GetAttrString(pModule, "testpyfile");
    if(!pLoadFunc)
    {
    
    
        PyErr_Print();
        qDebug()<<"not loaded pLoadFunc";
        return -1;
    }
    else
        qDebug()<<"load pLoadFunc success";

    pArgs = PyTuple_New(1);
    PyTuple_SetItem(pArgs, 0 , Py_BuildValue("s", "xuheqing"));
    pReturn = PyObject_CallObject(pLoadFunc, pArgs);
    if(!pReturn)
    {
    
    
        qDebug()<<"no return value";
        return -1;
    }

    str = PyObject_Str(pReturn);

    bytes = PyUnicode_AsUTF8(str);

    qDebug()<<bytes;

	Py_Finalize();// 关闭 Python 脚本解释器

    return a.exec();
}

참고: 절대 경로는 우리가 직접 작성한 .py 파일을 추가하기 위해 PyRun_SimpleString("sys.path.append('/home/book/QT/my_qt/qt_python/py_test')")에서 사용되므로 파일은 개발 보드의 /home/book/QT/my_qt/qt_python/py_test 디렉터리에 있습니다(그렇지 않은 경우 직접 만들 수 있습니다). 그렇지 않으면 개발 보드가 실행될 때 파일 모듈을 찾을 수 없다는 오류가 발생합니다! ! !

  1. 빌드하기 전에 sudo vi /home/book/arm-python/include/python3.6m/object.h를 아래와 같이 수정합니다. (QT에서는 슬롯이 키로 정의되고, python3에서는 슬롯이 변수로 사용되기 때문에 컴파일 시 충돌이 발생합니다.)
    여기에 이미지 설명을 삽입하세요.

  2. 크로스 컴파일 도구를 선택한 다음 py_test 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 빌드를 클릭하여 arm 아키텍처에서 실행할 수 있는 프로그램 py_test를 가져옵니다.
    여기에 이미지 설명을 삽입하세요.
    여기에 이미지 설명을 삽입하세요.

  3. FileZilla 등의 도구를 통해 py_test 파일을 개발 보드의 /mnt 디렉터리로 전송합니다. 먼저 chmod +x py_test를 실행하고 py_test에 실행 가능한 작업을 추가한 다음 ./py_test를 추가합니다. 이때 오류가 발생합니다.
    ./py_test: 공유 라이브러리를 로드하는 동안 오류가 발생했습니다. libpython3.6m.so.1.0: 공유 개체 파일을 열 수 없습니다: Norectory
    해결 방법 :
    ① 먼저 명령을 사용하여 echo $PATH현재 PATH 환경 변수를 표시합니다. 내 환경 변수는 / bin:/sbin:/usr/bin:usr/sbin입니다. 프로그램을 실행하면 쉘은 PATH 변수의 값을 기반으로 프로그램에 대한 이러한 경로를 자동으로 검색합니다. 그래서 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/book/arm-python/libPython 관련 라이브러리에 경로를 추가하고 실행할 수 있습니다.
    (참고: 이는 방법 중 하나일 뿐이며 임시 수정일 뿐입니다. 개발보드를 다시 시작한 후 환경 변수를 재설정해야 합니다.)
    ② vi /etc/profile. 파일 끝에 추가됩니다 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/book/arm-python/lib. 그런 다음 개발 보드를 다시 시작하십시오 . /etc/profile에 있는 환경변수는 모든 사용자에게 유효하며 시스템이 시작될 때 실행되는데, 이는 환경변수가 영구적으로 유효하도록 하는 방법이다.

  4. 작업 결과
    여기에 이미지 설명을 삽입하세요.

5. 참고문서 링크

  1. Python과 타사 라이브러리의 교차 컴파일
  2. 우분투 환경의 QT+Python 하이브리드 프로그래밍
  3. Py_Initialize: 가상 Python 환경 C++를 사용하여 Python 스크립트를 호출할 때 파일 시스템 코덱을 로드할 수 없음 오류가 발생함

추천

출처blog.csdn.net/m0_43443861/article/details/127907530