簡體   English   中英

Python:在Anaconda(Windows)中將C ++模塊作為共享庫而不是擴展庫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM