【问题标题】:Using cython extension once compiled [under Windows], how to use .pyd's?[在 Windows 下] 编译后使用 cython 扩展,如何使用 .pyd?
【发布时间】:2023-03-16 15:44:01
【问题描述】:

我习惯于在 Linux 下使用 Cython 编译自制的 python 扩展。在 Linux 上,我使用 distutils 生成一个“myext.so”,然后我可以简单地将其添加到我的PYTHONPATH 并获得可用的import myext python 调用。

现在,我正试图让它在 Windows 7 下运行(使用 Cython 0.18)。 我成功地运行了 distutils,现在我得到了一个 myext.pyd 文件。但似乎 (http://docs.python.org/2/faq/windows.html#is-a-pyd-file-the-same-as-a-dll) 在 windows 下添加到“myext.pyd”的路径是不够的。 “myext.py”应该是什么样子,或者换句话说,在我的 Python (2.7) 安装中获取我的扩展的过程是什么。

注意:将包含“myext.pyd”的目录添加到 PYTHONPATH 后,我仍然得到:

python BdmLsim4.py -i model.xml
Traceback (most recent call last):
  File "BdmLsim4.py", line 6, in <module>
    import myext
ImportError: DLL load failed: module not found.

非常感谢。

【问题讨论】:

  • sys.pathImportError 之前的样子是什么? AFAIK 将目录放在 PYTHONPATH 中是您必须做的一切,所以也许您没有正确添加目录。
  • Sys.path = [..., 'D:\\02_DEV\\EVOLAB\\EVOLAB-2013-05-02\\ECLIPSE-WS_ELP\\evolab-cython\\src\\空间', 'D:\\02_DEV\\EVOLAB\\EVOLAB-2013-05-02\\ECLIPSE-WS_ELP\\evolab-cython\\setup', 'C:\\Windows\\system32\\python27.zip ', 'C:\\Python27\\DLLs', ...] 其中 'D:\\02_DEV\\EVOLAB\\EVOLAB-2013-05-02\\ECLIPSE-WS_ELP\\evolab-cython\\setup'是我的 .pyd 的位置。我检查了 Cython 生成的“myext.cpp”,其中包含所需的“PyMODINIT_FUNC initmyext(void); /*proto*/”指令。所以路径似乎没问题。可能是我的 .pyd 文件没有编译好。你怎么看?
  • 您在使用 Eclipse 吗?您是否尝试从命令提示符而不是在 Eclipse 中运行程序?
  • 是的,我正在使用 Eclipse,但我也尝试了直接命令行...
  • 您是否尝试从其所在目录导入您的模块?即cd D:\\02_DEV etc.; python import myext.

标签: python distutils pythonpath pyd


【解决方案1】:

在您链接的文档中清楚地写了:

注意foo.pyd的搜索路径是PYTHONPATH,不一样 作为 Windows 用于搜索 foo.dll 的路径。另外, foo.pyd 不需要在场即可运行您的程序,而如果您链接了您的 带有 dll 的程序,dll 是必需的。当然, foo.pyd 是 如果你想说 import foo 是必需的。在 DLL 中,声明了链接 在带有 __declspec(dllexport) 的源代码中。在 .pyd 中,链接是 在可用函数列表中定义。

所以你应该把你的.pyd文件放在python的安装目录(site-packages),或者你可以修改环境变量PYTHONPATH并添加.pyd所在的目录。

另一种选择是使用.pth 文件来扩展PYTHONPATH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2012-01-01
    • 2012-01-05
    • 2015-01-09
    相关资源
    最近更新 更多