파이썬에서 DLL 사용
4139 단어 C++파이썬VisualStudio2017
소개
거기에서 Python에서 C++로 만든 DLL을 읽고 싶기 때문에 알아야 할 필요가 나왔습니다.
나 자신 Python도 C++도 만만치 정도밖에 모르기 때문에, 조금 빠졌습니다.
여러가지 기사가 이미 세상에 존재하고 있습니다만, 자신을 위해서 써 남기고 싶습니다.
먼저 DLL 준비
VS2017 사용 중입니다.
동적 링크 라이브러리 프로젝트를 만듭니다. 이름은 무엇이든 좋다고 생각합니다.
이번에는 DLLTest라는 이름으로 만들고 있습니다.
DLL 프로그램을 만들어갑니다
DLLTest.h#pragma once
#ifdef DLLTEST_EXPORTS
#define DLLTEST_API extern "C" __declspec(dllexport)
#else
#define DLLTEST_API extern "C" __declspec(dllimport)
#endif // DLLTEST_EXPORTS
DLLTEST_API int GetData(int, int);
extern "C" __declspec(dllexport)
에서 함수 내보내기 선언합니다.
DLLTest.cpp// DLLTest.cpp : DLL アプリケーション用にエクスポートされる関数を定義します。
//
#include "stdafx.h"
#include "DLLTest.h"
int GetData(int a, int b)
{
return a + b;
}
실행할 함수를 만들어갑니다.
stdafx.h// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、
// または、参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。
//
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN // Windows ヘッダーからほとんど使用されていない部分を除外する
// Windows ヘッダー ファイル
#include <windows.h>
#include <string>
// プログラムに必要な追加ヘッダーをここで参照してください
#include "DLLTest.h"
네, 그 이상입니다. 빠져 나오는 부분은 나중에 설명합니다. 먼저 성공 패턴으로.
Debug 빌드를 수행하여 DLL을 만듭니다. DLL은 프로젝트의 Debug 폴더 안에 있습니다.
다음으로 파이썬 측에서 호출
PC에는 Python 3.7과 2.7이 설치되어 있지만 3.7을 이번에 사용하고 있습니다.
VS2017에서 만든 DLL을 파이썬 소스 위치에 복사합니다.
그런 다음 LoadLibrary에 DLL 이름을 설정합니다.
test.py# coding: utf-8
from ctypes import *
dll = cdll.LoadLibrary("DLLTest.dll")
print(dll.GetData(100, 101))
이제 파이썬을 실행하면. DLL로 결과를 얻을 수있었습니다.
> py test.py
201
빠진 곳
"OSError: [WinError 193] %1이(가) 유효한 Win32 응용 프로그램이 아닙니다."라고 나왔습니다.
해결
DLL 빌드가 x64 아니었다. 파이썬을 64비트로 설치했기 때문입니다. 알아차리는 데 약간의 시간이 걸렸습니다. .
「AttributeError: function 'GetData' not found」라고 나왔다.
해결
extern "C"가 빠졌습니다.
DLLTest.h#define DLLTEST_API extern "C" __declspec(dllexport)
여러가지 공부가 되었습니다.
Reference
이 문제에 관하여(파이썬에서 DLL 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/satoysan/items/890b542a28e163a96e0d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#pragma once
#ifdef DLLTEST_EXPORTS
#define DLLTEST_API extern "C" __declspec(dllexport)
#else
#define DLLTEST_API extern "C" __declspec(dllimport)
#endif // DLLTEST_EXPORTS
DLLTEST_API int GetData(int, int);
// DLLTest.cpp : DLL アプリケーション用にエクスポートされる関数を定義します。
//
#include "stdafx.h"
#include "DLLTest.h"
int GetData(int a, int b)
{
return a + b;
}
// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、
// または、参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。
//
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN // Windows ヘッダーからほとんど使用されていない部分を除外する
// Windows ヘッダー ファイル
#include <windows.h>
#include <string>
// プログラムに必要な追加ヘッダーをここで参照してください
#include "DLLTest.h"
# coding: utf-8
from ctypes import *
dll = cdll.LoadLibrary("DLLTest.dll")
print(dll.GetData(100, 101))
> py test.py
201
#define DLLTEST_API extern "C" __declspec(dllexport)
Reference
이 문제에 관하여(파이썬에서 DLL 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/satoysan/items/890b542a28e163a96e0d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)