[英]Python: Building a C++ Module in Anaconda (Windows) as a shared object and not as an extension
假設您在文件“ fun.cpp”中具有要與python一起使用的C ++函數
extern "C" int fun(int i)
{
return i*2;
}
然后,您可以使用以下“ setup.py”
from distutils.core import setup, Extension
module1 = Extension('fun', sources = ['src/fun.cpp'],include_dirs = ['src/'])
setup (name = 'fun',
version = '1.0',
description = 'This is a fun package',
ext_modules = [module1],
packages = ['fun'])
然后在有趣的包中,您可以擁有以下__init__.py
import ctypes
fun = ctypes.cdll.LoadLibrary(__path__[0]+"/../fun.so").fun
fun.restype = ctypes.c_int
fun.argtype = ctypes.c_int
所以你可以像這樣使用它
>>import fun
>>fun.fun(2)
>>4
:)
這在Linux上運行完美,但是當我在Windows上使用Anaconda進行嘗試時,鏈接器首先要求我提供一個initfun符號,這意味着它正在嘗試構建python擴展而不是僅僅構建共享對象。 有誰知道如何更改setup.py或Anaconda設置,以建立共享庫並將其與“ ctypes.cdll.LoadLibrary”函數一起使用?
提前致謝。
我終於使用了這個解決方案。 不盡如人意,因為它試圖以一種不安全的方式找到Anaconda路徑。
from distutils.core import setup, Extension
from sys import platform as _platform
if _platform == "linux" or _platform == "linux2":
module1 = Extension('fun/fun', sources = ['src/fun.cpp','src/cochlea.cpp'],include_dirs = ['src/'], extra_compile_args=['-Ofast','-flto','-march=native','-funroll-loops'] )
setup (name = 'fun',
version = '1.0',
description = 'This is a demo package',
ext_modules = [module1],
packages = ['fun'])
elif _platform == "darwin":
module1 = Extension('fun/fun', sources = ['src/fun.cpp','src/cochlea.cpp'],include_dirs = ['src/'], extra_compile_args=['-Ofast','-flto','-march=native','-funroll-loops'] )
setup (name = 'fun',
version = '1.0',
description = 'This is a demo package',
ext_modules = [module1],
packages = ['fun'])
elif _platform == "win32":
import sys
for a in sys.path:
f = a.find('Anaconda')
if f!=-1:
path = a[:f+9]
import os
os.system("gcc.bat -mdll -O -Wall -Isrc/ -I"+path+"include -I"+path+"PC -c src/fun.cpp -o fun.o -Ofast -flto -march=native -funroll-loops")
os.system("g++.bat -shared -s fun.o -o fun.dll")
setup (name = 'fun',
version = '1.0',
description = 'This is a demo package',
package_data={'fun': ['fun.dll']},
packages = ['fun'])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.