问题的症结在于:
我正在使用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。
有人有这样的问题吗?我错过了一些关键的东西吗?
答案 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 ...
构建。从任何地方运行,你应该看到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。