ctypes는 라이브러리로드를 소유하지만 함수 / 메소드에 액세스 할 수 없습니다.

폴라 토마스

파이썬 스크립트 속도를 높이기 위해 ac 루틴을 작성하려고합니다.

내 방법을 증명하기 위해 먼저 간단한 테스트 c 함수를 작성하고 라이브러리로 컴파일했습니다. 테스트 함수의 코드는 다음과 같습니다.

void cttest(void);
#include <stdio.h>

void cttest()
{
    printf("This is the shared module|n");
    return;
}

이 코드를 'ct_test.cc'파일에 저장했습니다.

그런 다음이 코드를 다음과 같이 컴파일했습니다.

g++ -shared -fPIC -o /home/paula/libs/libcttest.so ct_test.cc

오류나 경고를주지 않았습니다.

그런 다음 ipython을로드하고 다음을 입력했습니다.

import ctypes as ct

test=ct.CDLL("/home/paula/libs/libcttest.so")

이제 함수에 액세스하려고하면 ( 'test.'를 입력 한 다음 탭을 눌러) 아무 일도 일어나지 않습니다.

이렇게하면 :

내가 무엇을 잘못하고 있지?

오, 차이가있을 경우를 대비하여 :

운영체제 : xubuntu 14.10 Python : 2.7.8 ipython : 2.3.0 g ++ : 4.9.1

플 렉소

두 가지 문제가 있습니다.

  1. 첫째, 이미 언급했듯이 탭 자동 완성은 함수가 처음으로 사용될 때까지 ctypes에서 작동하지 않습니다. (대부분의 플랫폼에서 작동하도록 만드는 것이 불가능하지는 않지만 내가 의심하는 라이브러리를로드하는 데 상당한 오버 헤드가 추가됩니다.)
  2. C를 작성했고 C처럼 호출하려고했지만 C ++ 컴파일러를 사용 했으므로 이름 변경 문제가 있습니다.

첫 번째 문제에 대한 해결책은 사소한 것입니다. 전체 이름을 사용하고 자동 완성에 의존하지 마십시오. 두 번째에 대한 최소 3 가지 해결책이 있습니다. 여기에 최선에서 최악까지 작성했습니다.

  1. C ++ 컴파일러 대신 C 컴파일러를 사용하십시오. ( gcc대신 g++).
  2. extern "C"C ++ 컴파일러가 함수 이름을 왜곡하지 않도록 강제하는 데 사용 합니다.

    extern "C" void cttest(void);
    
    extern "C" 
    {
        void cttest()
        {
            printf("This is the shared module\n");
            return;
        }
    }
    
  3. 파이썬에서 잘린 C ++ 이름을 사용하세요.이 경우에는 _Z6cttestv

이것이 작동하는지 증명하기 위해 Ubuntu 14.04에서 시도했습니다.

gcc -shared -fPIC -o libcttest.so test.c

그리고 ipython에서 사용 :

ipython
Python 2.7.6 (default, Mar 22 2014, 22:59:38) 
Type "copyright", "credits" or "license" for more information.

IPython 1.2.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: import ctypes as ct

In [2]: test=ct.CDLL('./libcttest.so')

In [3]: test.cttest()
This is the shared module
Out[3]: 26

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

자바 : 메소드에 액세스 할 수 없습니다.

분류에서Dev

self.method_name이 개인 메소드에 액세스 할 수없는 이유는 무엇입니까? private method_name만이 모든 메소드에서 루비의 private 메소드에 액세스 할 수 있습니다.

분류에서Dev

Blazor WebAssembly는 클래스 라이브러리에서 리소스 파일을로드 할 수 없습니다.

분류에서Dev

공유 드라이브에서 git repo를 사용하려고하지만 Apache 또는 Windows 탐색기로 파일에 액세스 할 수 없습니다.

분류에서Dev

Java에서 클래스 메소드에 액세스 할 수 없습니다.

분류에서Dev

활동에서 액세스 할 수없는 단편 메소드

분류에서Dev

활동에서 액세스 할 수없는 단편 메소드

분류에서Dev

메서드 내부에 소품에 액세스 할 수 없습니다.

분류에서Dev

구성 요소 메서드에서 $ ref에 액세스 할 수 없습니다.

분류에서Dev

vue-resource에서`get` 메소드에 액세스 할 수 없습니다.

분류에서Dev

VPN은 IP로 네트워크 드라이브에 액세스 할 수 있지만 컴퓨터 이름으로는 액세스 할 수 없습니다.

분류에서Dev

모바일 측 또는 REST를 통해 메소드 서버에 액세스 할 수 없습니다.

분류에서Dev

'GET'메소드로 Express 'Router ()를 사용하여 내 매개 변수에 액세스 할 수없는 이유

분류에서Dev

프로그램에서 인쇄는 작동하지만 gdb는 "주소에서 메모리에 액세스 할 수 없습니다 ..."라고 말합니다.

분류에서Dev

LibGDX는 내부 이미지 리소스에 액세스 할 수 없습니다.

분류에서Dev

LibGDX는 내부 이미지 리소스에 액세스 할 수 없습니다.

분류에서Dev

OnsenUI는 코드의 구성 요소에 액세스 할 수 없습니다.

분류에서Dev

테이블 모델의 createCell 메소드 내에서 addActionListener 메소드에 액세스 할 수 없습니다.

분류에서Dev

안드로이드는 피카소 라이브러리를 사용할 수 없습니다

분류에서Dev

.NET 표준 라이브러리 유형에 액세스 할 수 없습니다.

분류에서Dev

ASP.NET은 요청 된 리소스에 액세스 할 권한이 없습니다. 디버그 모드에서 폴더에 액세스 할 수 있지만 IIS에 배포 할 때는 액세스 할 수 없습니다.

분류에서Dev

내 개체의 속성에 액세스 할 수 있지만 함수에는 액세스 할 수 없습니다.

분류에서Dev

할당되었지만 액세스 할 수없는 SSD 드라이브를 사용할 수 있습니까?

분류에서Dev

Dart의 다른 라이브러리를 통해로드 할 때 한 라이브러리의 최상위 루틴에 액세스 할 수 없습니다.

분류에서Dev

JQuery는 Ajax 함수 후에 새 요소에 액세스 할 수 없습니다.

분류에서Dev

IP로 웹에 액세스 할 수 있지만 DNS 이름으로는 액세스 할 수 없습니다.

분류에서Dev

BIOS는 부팅 드라이브를 감지 할 수 없지만 Gparted / ubuntu는 제대로 액세스 할 수 있습니다.

분류에서Dev

링크 된 목록 메소드에 액세스 할 수 없으며 통과 할 수 없습니다

분류에서Dev

prePersist 이벤트 리스너에서 OrderHasComment 공용 메소드에 액세스 할 수 없습니다.

Related 관련 기사

  1. 1

    자바 : 메소드에 액세스 할 수 없습니다.

  2. 2

    self.method_name이 개인 메소드에 액세스 할 수없는 이유는 무엇입니까? private method_name만이 모든 메소드에서 루비의 private 메소드에 액세스 할 수 있습니다.

  3. 3

    Blazor WebAssembly는 클래스 라이브러리에서 리소스 파일을로드 할 수 없습니다.

  4. 4

    공유 드라이브에서 git repo를 사용하려고하지만 Apache 또는 Windows 탐색기로 파일에 액세스 할 수 없습니다.

  5. 5

    Java에서 클래스 메소드에 액세스 할 수 없습니다.

  6. 6

    활동에서 액세스 할 수없는 단편 메소드

  7. 7

    활동에서 액세스 할 수없는 단편 메소드

  8. 8

    메서드 내부에 소품에 액세스 할 수 없습니다.

  9. 9

    구성 요소 메서드에서 $ ref에 액세스 할 수 없습니다.

  10. 10

    vue-resource에서`get` 메소드에 액세스 할 수 없습니다.

  11. 11

    VPN은 IP로 네트워크 드라이브에 액세스 할 수 있지만 컴퓨터 이름으로는 액세스 할 수 없습니다.

  12. 12

    모바일 측 또는 REST를 통해 메소드 서버에 액세스 할 수 없습니다.

  13. 13

    'GET'메소드로 Express 'Router ()를 사용하여 내 매개 변수에 액세스 할 수없는 이유

  14. 14

    프로그램에서 인쇄는 작동하지만 gdb는 "주소에서 메모리에 액세스 할 수 없습니다 ..."라고 말합니다.

  15. 15

    LibGDX는 내부 이미지 리소스에 액세스 할 수 없습니다.

  16. 16

    LibGDX는 내부 이미지 리소스에 액세스 할 수 없습니다.

  17. 17

    OnsenUI는 코드의 구성 요소에 액세스 할 수 없습니다.

  18. 18

    테이블 모델의 createCell 메소드 내에서 addActionListener 메소드에 액세스 할 수 없습니다.

  19. 19

    안드로이드는 피카소 라이브러리를 사용할 수 없습니다

  20. 20

    .NET 표준 라이브러리 유형에 액세스 할 수 없습니다.

  21. 21

    ASP.NET은 요청 된 리소스에 액세스 할 권한이 없습니다. 디버그 모드에서 폴더에 액세스 할 수 있지만 IIS에 배포 할 때는 액세스 할 수 없습니다.

  22. 22

    내 개체의 속성에 액세스 할 수 있지만 함수에는 액세스 할 수 없습니다.

  23. 23

    할당되었지만 액세스 할 수없는 SSD 드라이브를 사용할 수 있습니까?

  24. 24

    Dart의 다른 라이브러리를 통해로드 할 때 한 라이브러리의 최상위 루틴에 액세스 할 수 없습니다.

  25. 25

    JQuery는 Ajax 함수 후에 새 요소에 액세스 할 수 없습니다.

  26. 26

    IP로 웹에 액세스 할 수 있지만 DNS 이름으로는 액세스 할 수 없습니다.

  27. 27

    BIOS는 부팅 드라이브를 감지 할 수 없지만 Gparted / ubuntu는 제대로 액세스 할 수 있습니다.

  28. 28

    링크 된 목록 메소드에 액세스 할 수 없으며 통과 할 수 없습니다

  29. 29

    prePersist 이벤트 리스너에서 OrderHasComment 공용 메소드에 액세스 할 수 없습니다.

뜨겁다태그

보관