【问题标题】:Loading DLL from embedded python code in c从c中的嵌入式python代码加载DLL
【发布时间】:2011-04-08 00:15:30
【问题描述】:

我的问题的症结在于:

我正在使用 MS Visual Studio 10.0 在 C 中的 Windows XP 上开发代码,我需要嵌入 Python 来执行一些绘图、文件管理和其他一些事情。我在 sys.path 查找我的 Pure-Python 模块时遇到了问题,但我通过修改 PYTHONPATH 解决了这个问题。

现在,我的问题是让 python 找到由某些模块引入的动态库。特别是,我的问题是将文件夹压缩成同名的bzip2 achive。

在普通的 python 命令提示符下,这可以正常工作:

import tarfile
tar=tarfile.open('Code.tar.bz2','w:bz2')
tar.add('Code',arcname='Code')
tar.close()

但是当我从我的 c 代码中调用这段代码时,它给了我这个错误:

Traceback (most recent call last):
  File "<string>", line 4, in <module>
  File "D:\My_Documents\Code\ScrollModel\trunk\PythonCode.py", line 20, in Colle
ctFiles
    tar=tarfile.open(os.path.join(runPath,'CODE.tar.bz2'),'w:bz2')
  File "c:\Python26\lib\tarfile.py", line 1671, in open
    return func(name, filemode, fileobj, **kwargs)
  File "c:\Python26\lib\tarfile.py", line 1737, in bz2open
    raise CompressionError("bz2 module is not available")
tarfile.CompressionError: bz2 module is not available

我怀疑这个问题类似于Embedded Python 第 5.6 节中描述的问题,但有点难以判断。如果我这样做,它的价值是什么

Py_Initialize();
PyRun_SimpleString("import ssl\n");
Py_Finalize();

它也不起作用,我得到一个 ImportError。

有人遇到过这样的问题吗?我错过了什么重要的东西吗?

【问题讨论】:

    标签: python c embedding


    【解决方案1】:

    试试这个,它可以在我的机器上运行。

    在 Visual Studio 2010 中创建一个简单的 Windows 控制台应用程序(删除向导中的预编译头选项)。用这个替换生成的代码:

    #include <Python.h>
    
    int main(int argc, char *argv[]) {
        Py_Initialize();
    
        PyRun_SimpleString("import ssl        \n"
                           "for f in dir(ssl):\n"
                           "    print f       \n" );
    
        Py_Finalize();
        return 0;
    }
    

    将 PYTHONHOME 设置为类似 c:\Python...

    • 将 C:\Python\Include 添加到包含路径
    • 将 C:\Python\Libs 添加到库路径
    • 将 python26.lib 添加到链接器输入(根据您的 Python 版本进行调整)

    构建。从任何地方运行,您应该会看到 ssl 模块的内容列表。

    我也尝试过使用 Mingw。相同的文件,使用此命令行构建:

    gcc -Wall -o test.exe embeed.c -I%PYTHONHOME%\Include -L%PYTHONHOME%\libs -lpython26
    

    【讨论】:

      【解决方案2】:

      你好,我问了similar question,我的操作系统是Linux

      当我编译c文件时,应该添加选项$(python-config --cflags --ldflags),如

      gcc test.c $(python-config --cflags --ldflags) -o test

      我认为在 Windows 中您也可以检查python-config 选项,希望这会有所帮助!

      【讨论】:

        【解决方案3】:

        我在使用 Boost C++ DLL 时遇到了类似的问题。任何外部 DLL 都需要在 DLL 搜索路径中。

        根据我的经验,PYTHONPATH 会影响 Python 模块(Python 中的 import 语句最终会调用 LoadLibrary),而构建选项与它无关。

        当您加载 DLL 时,Windows 并不关心进程是什么。换句话说,Python 遵循与记事本相同的DLL loading rules。您可以通过将任何缺失的 DLL 复制到与您的 python 扩展相同的目录中或复制到您的路径中的目录来确认您遇到了 Windows 路径问题。

        要查找任何其他可执行文件或 DLL 所需的 DLL,只需使用 DependencyWalker 打开 DLL 或 EXE 文件。还有一个“配置文件”菜单,可让您运行应用程序并观察它搜索和加载 DLL。

        【讨论】:

        • 我尝试将包含 DLL 的文件夹添加到 PATH,并且我尝试将它试图打开的 DLL 移动到 c:\windows\system32,但似乎都没有帮助。
        猜你喜欢
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多