我需要运行一系列python脚本来计算各种脚本,这些脚本工作正常,但其中一个运行速度非常慢,必须在C++中完成.C++代码已准备就绪,但我需要找到一种从python调用C++函数并获取返回值的方法.
我找到了有关SWIG的信息,但是没有让它在Windows上使用Visual Studio(我必须在Windows上的VS中执行它,因为其他限制).我发现使用标准输入和输出值的非常简单的函数更容易使用ctypes.
所以我用ctypes进行了很多测试,尝试了我在网上找到的所有例子,每次都会发生的事情是我可以加载dll(用visual studio 2012编译器构建),但是当我尝试在python中调用函数时,它只是:
Traceback (most recent call last):
File "test.py", line 3, in <module>
print maLib.plop()
File "C:\Python27\lib\ctypes\__init__.py", line 378, in __getattr__
func = self.__getitem__(name)
File "C:\Python27\lib\ctypes\__init__.py", line 383, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'plop' not found
Run Code Online (Sandbox Code Playgroud)
python代码是(test.py):
from ctypes import cdll
lib = cdll.LoadLibrary('test')
print lib.plop()
Run Code Online (Sandbox Code Playgroud)
C++代码是(test.cpp,编译为test.dll,Visual Studio设置为构建为dll):
extern "C"
{
int plop();
}
int plop() { return 4; }
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我试图让它尽可能简单,以避免细节使其失败.我已经阅读了python ctypes帮助,以及如何使用ctypes的教程,尝试与它们完全相同的代码,但我不得不适应一点,因为我使用的是Visual Studio/windows,而其他大多数用户都在使用linux.所有文件都在同一个文件夹中.
我尝试了多种加载库的方法:LoadLibrary('./ name.dll'),WinDLL('name.dll'),给函数一个不同的名称,void返回类型等等......
你认为我应该使用SWIG吗?我的问题是一个明显的初学者错误吗?我是一名学生,对我正在使用的大部分内容都很陌生,但我在这方面付出了很多努力,即使我只需要它来完成一项特定的任务.当使用SWIG时,我不得不用函数指针或引用创建一个包装器,所以我认为这是问题,这让我想尝试一个更简单的解决方案.
我正在使用:Python 2.7.7,Visual Studio 2012,Windows 8.1
提前谢谢了
在我的 Spring Boot 应用程序中,我希望 Liquibase 在 PostgreSQL 数据库上创建表,因此在我的配置类中,我设置了一个 Bean,它返回包含应使用的架构名称的MultiTenantSpringLiquibase 。
问题是这个 Bean 被创建但被忽略,Spring Boot 在 LiquibaseAutoConfiguration 中找到一个有效的 SpringLiquibase Bean,并在我的数据库上使用它,访问我为 MultiTenantSpringLiquibase 准备的相同更改日志。此操作失败,因为此配置尝试使用不存在的模式“public”。如果它确实存在,它会创建我在更改日志中定义的表,但我不希望它们出现在“公共”模式中。
如何防止 LiquibaseAutoConfiguration 或 SpringLiquibase 执行,以便使用我的 MultiTenantSpringLiquibase Bean?