无法在 python 中导入自定义 DLL

2024-01-17

我正在尝试将 C++ 类公开给 pythonboost::python,所以我正在经历本教程 http://www.boost.org/doc/libs/1_61_0/libs/python/doc/html/tutorial/tutorial/exposing.html。我创建了一个视觉工作室.dll项目,源代码如下:

#include <boost/python.hpp>
using namespace boost::python;

struct World
{
    void set(std::string msg) { this->msg = msg; }
    std::string greet() { return msg; }
    std::string msg;
};

BOOST_PYTHON_MODULE(hello)
{
    class_<World>("World")
        .def("greet", &World::greet)
        .def("set", &World::set)
    ;
}

我将它构建为 64 位 dll。本教程的下一步说:

在这里,我们编写了一个 C++ 类包装器,它公开了成员函数greet 和set。现在,将我们的模块构建为共享库后,我们可以在 Python 中使用我们的 World 类。下面是一个 Python 会话示例:

>>> import hello
>>> planet = hello.World()
>>> planet.set('howdy')
>>> planet.greet()
'howdy'

但是,在同一目录中启动 python 并输入import hello I get

>>> import hello
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'hello'
>>>

我尝试将“dll”文件重命名为hello.dll,并且还复制every输出文件 (dll, exp, ilk, lib, and pdb) to %PYTHONPATH%\DLLs,但我仍然无法将模块导入到 python 中。

很多谷歌搜索让我发现本文 http://wolfprojects.altervista.org/articles/dll-in-c-for-python/推荐我使用ctypes导入dll。这让我加载dll,但我仍然无法调用“World”类。例如:

>>> import ctypes
>>> mydll = ctypes.cdll.LoadLibrary("hello")
>>> mydll
<CDLL 'hello', handle 7fef40a0000 at 0x775ba8>
>>> hello = mydll.World()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Python35\lib\ctypes\__init__.py", line 360, in __getatt
r__
    func = self.__getitem__(name)
  File "C:\Program Files\Python35\lib\ctypes\__init__.py", line 365, in __getite
m__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'World' not found
>>>

所以有几个问题:

  1. 是否可以导入一个dll在Python中without使用ctypes?该教程似乎表明确实如此,但没有提供有关将 dll 导入 python 的正确方法的详细信息。

  2. 我需要哪些文件以及在哪里?看来我只需要dll我的 python shell 的工作目录中来自 Visual Studio 的文件,但这显然不适合我。

  3. 为什么我不能打电话World通过ctypes?

一些更重要的细节:我使用的是 Windows 7 64 位、Python 3.5.2 64 位和带有 Boost 1.61 的 Visual Studio 2015。


事实上,我在发布问题后不久就找到了答案。谢谢这篇博文 http://mmmovania.blogspot.com/2013/01/running-c-code-from-python-using.html我发现只需重命名hello.dll to hello.pyd就足够了。通过更多的谷歌搜索,我think that ctypes仅适用于 C DLL,不适用于 C++,并且not与助推!要点是boost::python,是为了消除对ctypes的需要并使DLL与python兼容。因此,回答我自己的所有问题:

  1. 可以,但是必须有一个.pyd扩大。

  2. 你只需要编译后的dll文件和boost_python_vc140...dll(可能会有所不同)。然而,正如我所说,dll文件必须重命名。

  3. 因为 ctypes 不是加载 a 的正确工具boost::python dll!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 python 中导入自定义 DLL 的相关文章

  • 如何让Python的socket服务器永远运行

    我有这段代码创建了一个简单的Python套接字服务器 但是每次客户端断开连接时它都会关闭 如何让它永远运行 import socket HOST PORT 8000 s socket socket socket AF INET socket
  • 管理 Tweepy API 搜索

    如果这是对之前在其他地方回答过的问题的粗略重复 请原谅我 但我不知道如何使用 tweepy API 搜索功能 是否有任何有关如何使用搜索推文的文档api search 功能 有什么方法可以控制返回的推文数量 结果类型等功能 由于某种原因 结
  • 在 Django 中获取数据库类型[重复]

    这个问题在这里已经有答案了 我需要能够确定 Django 运行时使用的数据库类型 MYSQL False if
  • xlrd 读取 xls XLRDError:不支持的格式或损坏的文件:预期的 BOF 记录;找到“\r\n”

    这是代码 xls open workbook data xls 作为回报 File home woles P2 fin fin apps data container importer py line 16 in import data x
  • [python]没有属性“TessBaseAPI”

    当我编译代码时出现错误 import tessercat api tesseract TessBaseAPI 错误是 AttributeError 模块 对象没有属性 TessBaseAPI 我已经安装了tesseract via pip
  • 如何使用ilMerge将dll合并到exe文件中? [复制]

    这个问题在这里已经有答案了 可能的重复 将 dll 与 exe 合并 https stackoverflow com questions 14551311 merging dll with exe 好的 所以 我将 ilmerge 的所有文
  • Python 列表理解不适用于 itertools.groupby 解码

    我正在尝试解码结果itertools groupby到一个值列表中 我的来源是 x 1 2 2 1 6 3 6 5 1 3 最初的方法是使用 for 语句来实现 如下所示 keyfunc itemgetter 0 groups unique
  • 如何充分释放函数中使用的GPU内存

    我在用着cupy在接收一个函数numpy数组 将其推到 GPU 上 对其进行一些操作并返回cp asnumpy它的副本 问题 函数执行后内存没有被释放 如ndidia smi 我知道内存的缓存和重用cupy 但是 这似乎仅适用于每个用户 当
  • 来自数据框 groupby 的条形图

    import pandas as pd import numpy as np import matplotlib pyplot as plt df pd read csv arrests csv df df replace np nan 0
  • 直接打开Spyder还是通过Pythonxy打开?

    之前 我一直在运行PythonSpyder 我总是开始Spyder直接双击其图标 今天突然发现我还有一个东西叫Python x y 我注意到我也可以开始Spyder通过它 这两种方法有什么区别吗 如果不是的话 有什么意义Python x y
  • Microsoft Azure 数据仓库和 SqlAlchemy

    我正在尝试使用 python 的 sqlalchemy 库连接到 microsoft azure 数据仓库 并收到以下错误 pyodbc Error HY000 HY000 Microsoft ODBC SQL Server Driver
  • 如何将 pip 指向 Mercurial 分支?

    我正在尝试通过 pip 将我的应用程序安装到 virtualenv 进行测试 安装时效果很好default or tip像这样 pip install e hg https email protected cdn cgi l email p
  • 使用 .map() 在 pandas DataFrame 中高效创建附加列

    我正在分析形状与以下示例类似的数据集 我有两种不同类型的数据 abc数据和xyz data abc1 abc2 abc3 xyz1 xyz2 xyz3 0 1 2 2 2 1 2 1 2 1 1 2 1 1 2 2 2 1 2 2 2 3
  • 当我打印“查询”时获取 PY_VAR1

    我正在制作一个简单的网络抓取代码 当我尝试打印一个值时 它给了我其他东西 def PeopleSearch query SearchTerm query what is query print str query SearchTerm St
  • Docker Build 找不到 pip

    尝试关注一些 1 https aws amazon com blogs aws run docker apps locally using the elastic beanstalk eb cli 2 http docs aws amazo
  • 如何从外语线程调用Python函数(C++)

    我正在开发一个程序 使用 DirectShow 来抓取音频数据 媒体文件 DirectShow 使用线程将音频数据传递给回调 我的程序中的函数 然后我让该回调函数调用另一个函数 Python 中的函数 我使用 Boost Python 来包
  • Python中的MariaDB连接器无法连接到远程服务器

    我使用与远程 Mariadb 服务器的连接已有几个月了 今天 无法再通过 macOS 上的 python mariadb 模块和 mariadb 连接器建立连接 基本安装如下 brew install mariadb connector c
  • 用户的完整 UNIX 用户名

    想知道您是否知道是否有一种巧妙的方法可以从 shell 获取完整的用户名 示例 如果我的 UNIX 用户名是 froyo 那么我想获取我的全名 在本例中 如系统中注册的那样 froyo Abhishek Pratap Finger 命令可以
  • Matplotlib 渲染日期、图像的问题

    我在使用 conda forge 的 Matplotlib v 3 1 3 和 python 3 7 时遇到问题 我拥有 Matplotlib 所需的所有依赖项 当我输入这段代码时 它应该可以工作 我得到了泼溅艺术 它基于此 YouTube
  • 将自定义属性添加到 Tk 小部件

    我的主要目标是向小部件添加隐藏标签或字符串之类的内容 以在其上保存简短信息 我想到创建一个新的自定义 Button 类 在本例中我需要按钮 它继承所有旧选项 这是代码 form tkinter import class NButton Bu

随机推荐