C ++로 파이썬을 확장 할 때 모듈 메서드를 다른 소스 파일에 넣는 것이 실패합니다.

모하메드 리

일부 C ++ 코드로 파이썬을 확장하려고합니다. 나는 여기 가이드를 고수했습니다

https://docs.python.org/2/extending/extending.html

표준 헤더 spammodule.h를 사용합니다.

#ifndef Py_SPAMMODULE_H
#define Py_SPAMMODULE_H
#ifdef __cplusplus
extern "C" {
#endif

/* Header file for spammodule */

/* C API functions */
#define PySpam_System_NUM 0
#define PySpam_System_RETURN int
#define PySpam_System_PROTO (const char *command)

/* Total number of C API pointers */
#define PySpam_API_pointers 1


#ifdef SPAM_MODULE
/* This section is used when compiling spammodule.c */

static PySpam_System_RETURN PySpam_System PySpam_System_PROTO;

#else
/* This section is used in modules that use spammodule's API */

static void **PySpam_API;

#define PySpam_System \
 (*(PySpam_System_RETURN (*)PySpam_System_PROTO) PySpam_API[PySpam_System_NUM])

/* Return -1 on error, 0 on success.
 * PyCapsule_Import will set an exception if there's an error.
 */
static int
import_spam(void)
{
    PySpam_API = (void **)PyCapsule_Import("spam._C_API", 0);
    return (PySpam_API != NULL) ? 0 : -1;
}

#endif

#ifdef __cplusplus
}
#endif

#endif /* !defined(Py_SPAMMODULE_H) */

실제 기능은 spam.cpp 파일에 저장됩니다.

#define SPAM_MODULE
#include "spammodule.h"
#include <Python.h>
#include <iostream>


static PyObject * some_other_method(PyObject *self, PyObject *args);
static PyObject * spam_system(PyObject *self, PyObject *args)
{
    const char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    system(command);
    sts = 2;
    return Py_BuildValue("i", sts);
}



static int
PySpam_System(const char *command)
{
    return system(command);
}

static PyMethodDef SpamMethods[] = {
    {"system",  spam_system, METH_VARARGS,
     "Execute a shell command."},
    {"some_other_method", some_other_method, METH_VARARGS, "do new stuff"},
    {NULL, NULL, 0, NULL}        /* Sentinel */
};

파일 method.cpp에 넣어

#include <Python.h>
#include <iostream>


static PyObject * some_other_method(PyObject *self, PyObject *args){
    std::cout<<"hello world\n"<<std::endl;
    int sts = 2;
    return Py_BuildValue("i", sts);

}

이것은 경고와 함께 컴파일됩니다.

spam.cpp:7:19: warning: ‘PyObject* some_other_method(PyObject*, PyObject*)’ used but never defined [enabled by default]
 static PyObject * some_other_method(PyObject *self, PyObject *args);

파이썬 스크립트에서 가져올 때 실패합니다.

import spam

spam.system("ls -l")
spam.some_other_method()

그러나 some_other_method의 전방 선언을 실제 코드로 대체하면

//static PyObject * some_other_method(PyObject *self, PyObject *args);
#include "method.cpp"

잘 작동합니다.

  1. 왜 이런 식으로 작동합니까?
  2. 메소드 함수의 실제 코드를 별도의 소스 파일에 넣고 개별적으로 컴파일하는 옵션이 있습니까?
보 페르손

함수 static가 정의 된 경우 cpp 파일에서만 볼 수 있습니다. 다른 cpp 파일에서 호출 할 수 없습니다 (먼저 함수에 대한 포인터를 얻지 않는 한).

static자신의 소스 파일 외부에서 볼 수있는 함수에서 제거해야 합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

크롬 확장에서 페이지를 다시로드 할 때 특정 스크립트 파일을 실행합니다.

분류에서Dev

한 도메인에서 다른 도메인으로 소스로 가져올 때 실제 .js 파일을 사용하는 것이 중요합니까?

분류에서Dev

저장소에서 다운로드하고 소스에서 컴파일 할 때 qemu 성능이 다른 이유는 무엇입니까?

분류에서Dev

확장 사이 썬 / 파이썬을 구축 할 때 다른 링커를 지정?

분류에서Dev

ghci에서 컴파일 된 모듈을로드 할 때 '인터페이스로드 실패'오류

분류에서Dev

셀레늄 + 파이썬 + 유닛 테스트는 : 테스트를 실행할 때 오류 메시지가 "다른 요소는 클릭을받을 것"

분류에서Dev

새 텍스트 파일을 생성하고 파이썬으로 스크립트를 실행할 때마다 저장해야합니다.

분류에서Dev

반응 애플리케이션에서 babel 모듈 리졸버 + eslint + 인덱스 파일을 사용할 때 모듈을 확인할 수 없습니다.

분류에서Dev

PyObject_CallMethod는 때때로 파이썬 메서드를 호출 할 때 오류를 세그합니다.

분류에서Dev

파이썬에서 메모리에 파일을 mmap /로드하고 다른 프로세스에서 액세스하는 방법은 무엇입니까?

분류에서Dev

동적 인수를 사용하여 일반 확장 메서드를 호출 할 때 C # 컴파일러가 잘못된 오류와 함께 실패합니다.

분류에서Dev

git 파이프 라인이 오류와 함께 실패 : 정확히 하나의 접근 자와 일치해야합니다! (.gitlab_ci.yml이 다른 저장소에서 템플릿을 호출 할 때)

분류에서Dev

내 테스트는 보이지 않기 때문에 헤드리스로 실행할 때 실패합니다.

분류에서Dev

파이썬 값 오류 예상 2는 텍스트 파일을 배열에 넣으려고 할 때 하나를 받았습니다.

분류에서Dev

파이썬 로깅 모듈이 실행 코드를 읽는 방법을 이해하지 못합니다.

분류에서Dev

파이썬 인터프리터는 다른 메소드에 메모리를 어떻게 할당합니까?

분류에서Dev

파이썬으로 파일을 업로드 할 때 메모리에있는 zip 파일의 내용을 읽는 방법은 무엇입니까?

분류에서Dev

파이썬으로 파일을 업로드 할 때 메모리에있는 zip 파일의 내용을 읽는 방법은 무엇입니까?

분류에서Dev

Notepad ++는 명령 줄에서로드 할 때 .txt 파일 확장자를 가정합니다.

분류에서Dev

CLIPS 통합 소스 코드를 컴파일 할 때 CLIPS 솔루션의 CLIPSStatic이 실패합니다.

분류에서Dev

로컬 저장소를 확인할 때 다크 모드 확인란이 멈춤

분류에서Dev

"Windows가 지정된 장치, 경로 또는 파일에 액세스 할 수 없습니다"와 함께 정상적인 프로세스가 실패 할 때 안티 바이러스 소프트웨어 (Avast)를 제거하는 방법은 무엇입니까?

분류에서Dev

Smtplib는 파이썬에서 사용하려고 할 때 부분적으로 초기화 된 모듈 오류를 제공합니다.

분류에서Dev

여러 파이썬 프로세스가 C ++ 확장을 통해 동일한 메모리를 공유하도록 강제 할 수 있습니까?

분류에서Dev

Newtonsoft.Json.dll을 참조 할 때 모노에서 런타임시 C # 코드 컴파일이 실패합니다.

분류에서Dev

이 프로그램을 C #에서 실행할 때 오류가 발생합니다. 'Movies'메서드에 대한 오버로드가 '0'인수를 사용하지 않습니다. 나는 그것을하는 방법이 필요하다

분류에서Dev

csv writer는 파이썬에서 파일을 .txt로 저장합니다.

분류에서Dev

파이썬에서 다음 코드 스 니펫을 실행할 때 20이 인쇄되는 이유

분류에서Dev

Android Studio에서 다른 모듈의 소스로 컴파일

Related 관련 기사

  1. 1

    크롬 확장에서 페이지를 다시로드 할 때 특정 스크립트 파일을 실행합니다.

  2. 2

    한 도메인에서 다른 도메인으로 소스로 가져올 때 실제 .js 파일을 사용하는 것이 중요합니까?

  3. 3

    저장소에서 다운로드하고 소스에서 컴파일 할 때 qemu 성능이 다른 이유는 무엇입니까?

  4. 4

    확장 사이 썬 / 파이썬을 구축 할 때 다른 링커를 지정?

  5. 5

    ghci에서 컴파일 된 모듈을로드 할 때 '인터페이스로드 실패'오류

  6. 6

    셀레늄 + 파이썬 + 유닛 테스트는 : 테스트를 실행할 때 오류 메시지가 "다른 요소는 클릭을받을 것"

  7. 7

    새 텍스트 파일을 생성하고 파이썬으로 스크립트를 실행할 때마다 저장해야합니다.

  8. 8

    반응 애플리케이션에서 babel 모듈 리졸버 + eslint + 인덱스 파일을 사용할 때 모듈을 확인할 수 없습니다.

  9. 9

    PyObject_CallMethod는 때때로 파이썬 메서드를 호출 할 때 오류를 세그합니다.

  10. 10

    파이썬에서 메모리에 파일을 mmap /로드하고 다른 프로세스에서 액세스하는 방법은 무엇입니까?

  11. 11

    동적 인수를 사용하여 일반 확장 메서드를 호출 할 때 C # 컴파일러가 잘못된 오류와 함께 실패합니다.

  12. 12

    git 파이프 라인이 오류와 함께 실패 : 정확히 하나의 접근 자와 일치해야합니다! (.gitlab_ci.yml이 다른 저장소에서 템플릿을 호출 할 때)

  13. 13

    내 테스트는 보이지 않기 때문에 헤드리스로 실행할 때 실패합니다.

  14. 14

    파이썬 값 오류 예상 2는 텍스트 파일을 배열에 넣으려고 할 때 하나를 받았습니다.

  15. 15

    파이썬 로깅 모듈이 실행 코드를 읽는 방법을 이해하지 못합니다.

  16. 16

    파이썬 인터프리터는 다른 메소드에 메모리를 어떻게 할당합니까?

  17. 17

    파이썬으로 파일을 업로드 할 때 메모리에있는 zip 파일의 내용을 읽는 방법은 무엇입니까?

  18. 18

    파이썬으로 파일을 업로드 할 때 메모리에있는 zip 파일의 내용을 읽는 방법은 무엇입니까?

  19. 19

    Notepad ++는 명령 줄에서로드 할 때 .txt 파일 확장자를 가정합니다.

  20. 20

    CLIPS 통합 소스 코드를 컴파일 할 때 CLIPS 솔루션의 CLIPSStatic이 실패합니다.

  21. 21

    로컬 저장소를 확인할 때 다크 모드 확인란이 멈춤

  22. 22

    "Windows가 지정된 장치, 경로 또는 파일에 액세스 할 수 없습니다"와 함께 정상적인 프로세스가 실패 할 때 안티 바이러스 소프트웨어 (Avast)를 제거하는 방법은 무엇입니까?

  23. 23

    Smtplib는 파이썬에서 사용하려고 할 때 부분적으로 초기화 된 모듈 오류를 제공합니다.

  24. 24

    여러 파이썬 프로세스가 C ++ 확장을 통해 동일한 메모리를 공유하도록 강제 할 수 있습니까?

  25. 25

    Newtonsoft.Json.dll을 참조 할 때 모노에서 런타임시 C # 코드 컴파일이 실패합니다.

  26. 26

    이 프로그램을 C #에서 실행할 때 오류가 발생합니다. 'Movies'메서드에 대한 오버로드가 '0'인수를 사용하지 않습니다. 나는 그것을하는 방법이 필요하다

  27. 27

    csv writer는 파이썬에서 파일을 .txt로 저장합니다.

  28. 28

    파이썬에서 다음 코드 스 니펫을 실행할 때 20이 인쇄되는 이유

  29. 29

    Android Studio에서 다른 모듈의 소스로 컴파일

뜨겁다태그

보관