为了找出这个问题,用了整天一天的时间来看Python的源码,不过还好,至少还熟悉了一下Python中这些杂乱的路径,并找到了原因。
issue11320 涉及的到就是Py_SetPath这个函数!
Manual中是这么介绍这个函数的:
void Py_SetPath(const wchar_t *)
Set the default module search path. If this function is called before Py_Initialize(), then Py_GetPath() won’t attempt to compute a default search path but uses the one provided instead. This is useful if Python is embedded by an application that has full knowledge of the location of all modules. The path components should be separated by semicolons.
此外:源码的注释中,也在建议使用这个函数:
* An embedding application can use Py_SetPath() to override all of
* these authomatic path computations.
起源
非常简单的一个程序:
#include "Python.h"
int main()
{
Py_SetPath(L"/home/debao/Download/python/lib/python3.2/;"
"/home/debao/Download/python/lib/python3.2/plat-linux2;"
"/home/debao/Download/python/lib/python3.2/lib-dynload");
Py_Initialize();
PyRun_SimpleString("print(\'Hello C/C++\')");
Py_Finalize();
return 0;
}
额,为了调试的方便,我用的Qt Creator,使用的.pro文件如下:
CONFIG -=qt
SOURCES += test.cpp
INCLUDEPATH += ../include/python3.2m
LIBS += -L../lib -lpython3.2m -lpthread -ldl -lutil
编译,运行,结果出错:
Fatal Python error: Py_Initialize: Unable to get the locale encoding
LookupError: no codec search functions registered: can't find encoding
错误出在,Py_InitalizeEx中initfsencoding(interp)一句,调试,调试,调试
最终发现Manual中说错了一句。路径中不是分号分割,而是用 冒号。准确一点,Windows下用分号,其他平台用冒号。
恩,我改
#include "Python.h"
int main()
{
Py_SetPath(L"/home/debao/Download/python/lib/python3.2/:"
"/home/debao/Download/python/lib/python3.2/plat-linux2:"
"/home/debao/Download/python/lib/python3.2/lib-dynload");
Py_Initialize();
PyRun_SimpleString("print(\'Hello C/C++\')");
Py_Finalize();
return 0;
}
这下好了,上面的错误没有了,可是,错误信息更长了....
Traceback (most recent call last):
File "/home/debao/Download/python/lib/python3.2/sysconfig.py", line 339, in _init_posix
_parse_makefile(makefile, vars)
File "/home/debao/Download/python/lib/python3.2/sysconfig.py", line 222, in _parse_makefile
with open(filename, errors="surrogateescape") as f:
IOError: [Errno 2] No such file or directory: 'lib/python3.2/config-3.2m/Makefile'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/debao/Download/python/lib/python3.2/site.py", line 529, in <module>
main()
File "/home/debao/Download/python/lib/python3.2/site.py", line 517, in main
known_paths = addusersitepackages(known_paths)
...
过程就不描述了,这个问题就是7个月前的issue11320所报告的。
原因
调用Py_SetPath会使得 sys.prefix 和 sys.exec_prefix 都为空。这点Manual中也提到了:
This also causes sys.executable to be set only to the raw program name (see Py_SetProgramName()) and for sys.prefix and sys.exec_prefix to be empty.
可是,在sysconfig.py文件中,需要使用 sys.prefix 来找到一个配置用的 makefile 文件,而空串 sys.prefix 导致生成错误的文件路径名:lib/python3.2/config-3.2m/Makefile,因此该文件无法被找到。
在Py_InitializeEx执行的后期,会导入 site.py 模块,而 site.py 模块需要 sysconfig.py 模块,从而导致这个问题。
如何解决?
不清楚这个bug如何解决,反正暂时在issue11320留下commit了,希望对官方解决这个问题能有帮助。
Py_SetPath目前是用不成了,不过还好,我们可以使用Py_SetPythonHome或者Py_SetProgramName。除此之外,环境变量也是可以用的,只是个人不太喜欢。
#include "Python.h"
int main()
{
#if 0
Py_SetPythonHome(L"/home/debao/Download/python/");
#else
Py_SetProgramName(L"/home/debao/Download/python/bin/python3");
#endif
Py_Initialize();
PyRun_SimpleString("print(\'Hello C/C++\')");
Py_Finalize();
return 0;
}
参考
分享到:
相关推荐
hx711py_树莓派_树莓派hx711_hx711py_tiredhpi_hx-py_源码.rar
使用py_innodb_page_info 查看分析各种log以及data file,深入研究mysql的存储引擎底层原理与实现。 mysql innodb undo redo
path.py, "Path" 对象方便地包装各种文件/路径相关功能 许可证在项目元数据( 典型的是一个或者多个Trove分类器) 中指明了许可证。 有关更多细节,请参见这里说明。 path.pypath.py 为第一类实体实现了路径对象,允许...
widget_set_change.py
chess_set.py
step2.5_test_set_prediction.py
Problem_Set_1_Part_A.py
py_03_第一个函数.py py_04_第一个函数改造.py py_05_函数的参数.py py_06_函数的返回值.py py_07_函数的嵌套调用.py py_08_打印分隔线.py py_09_打印多条分隔线.py py_10_分隔线模块.py py_10_模块体验.py
这是人工智能,吃豆人project1的searchagent的算法实现
包含以下py文件: train_pb2.py string_int_label_map_pb2.py ssd_pb2.py ssd_anchor_generator_pb2.py square_box_coder_pb2.py region_similarity_calculator_pb2.py preprocessor_pb2.py post_processing_pb2.py ...
应用名:webpy_blog 一个简单的 blog ,使用python web.py 0.38框架开发 采用MySQL数据库
get_project_path.py
资源来自pypi官网。 资源全名:jinja2_ospath-0.1.0-py2.py3-none-any.whl
命令行在windows下安装 caffe,所需要的依赖包。 第一部分,一共三部分
matlab生成维纳过程代码NEURAL_py:python中的新生儿EEG功能集 复制NEURAL功能集版本的Python代码。 该代码用于从多通道EEG记录生成一组定量特征。 功能包括幅度测量,频谱测量和基本连接性测量(仅在半球范围内)。...
python库,解压后可用。 资源全名:jinja2_ospath-0.1.0-py2.py3-none-any.whl
02_BeautifulSoup示例.py02_BeautifulSoup示例.py02_BeautifulSoup示例.py02_BeautifulSoup示例.py02_BeautifulSoup示例.py02_BeautifulSoup示例.py02_BeautifulSoup示例.py02_BeautifulSoup示例.py02_BeautifulSoup...
Python基础全套教程 细致讲解新手必备课件 python_1_4 move_ info7 test.py 14_爬虫小案例.py 09_logging模块.p y 13_re模块.py 16_总结.py ...27_set集合.py 24_dict_增删改查.py 25_dict_循环.p y 26_dic
03_BeautifulSoup示例2.py03_BeautifulSoup示例2.py03_BeautifulSoup示例2.py03_BeautifulSoup示例2.py03_BeautifulSoup示例2.py03_BeautifulSoup示例2.py03_BeautifulSoup示例2.py03_BeautifulSoup示例2.py03_...
将数据写入文件创建一个h5文件读取hdf