从c中嵌入的python代码加载DLL

时间:2011-04-08 00:15:30

标签: python c embedding

问题的症结在于:

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

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

从普通的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。

有人有这样的问题吗?我错过了一些关键的东西吗?

3 个答案:

答案 0 :(得分:2)

试试这个,它适用于我的机器。

在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

答案 1 :(得分:0)

嘿,我问过similar question,我的操作系统是 Linux

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

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

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

答案 2 :(得分:0)

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

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

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

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