在我的例子中,我将Python嵌入到我的应用程序中。当我的应用程序的路径包含一个非拉丁字符时,Py_Initialize在内部调用exit(1) (稍后会有更多信息)。
,所以我检查了是否可以用标准的解释器可执行文件.来再现它。
当PYTHONHOME的路径包含拉丁-1字符集外的字符时,Windows上的Python2.7.x似乎无法工作。问题是无法找到并导入模块站点。既然umlauts似乎有效,这里的实际限制是什么?只有拉丁文-1支持吗?为什么它要在OSX上工作呢?
C:\Users\ъ\Python27\python.exe // fails to start (KOI8-R)
^
C:\Users\ġ\Python27\python.exe // fails to start (latin-3)
^
C:\Users\ä\Python27\python.exe // works fine (latin-1)
^有什么想法吗?
背景:
我还没有完成代码,但是当站点不可用时,Python2.6和Python2.7的行为也不同。Py 2.6刚刚打印一条消息,Py 2.7拒绝开始。
static void
initsite(void)
{
PyObject *m;
m = PyImport_ImportModule("site");
if (m == NULL) {
...
// Python 2.7 and later
exit(1);
// Python 2.6 and prior
PyFile_WriteString("'import site' failed; traceback:\n", f);
}
...
}Python 2.7:https://github.com/enthought/Python-2.7.3/blob/master/Python/pythonrun.c#L725
Python2.6:https://github.com/python-git/python/blob/master/Python/pythonrun.c#L705
发布于 2016-05-19 08:11:50
我认为问题在于,在内部,Python2将所有内容作为平台系统编码中的字节字符串处理,这是(在西欧) CP1252是拉丁-1的一个变体。因此,它不能正确处理包含其他字符的PYTHONHOME路径也就不足为奇了。
但是,当我年轻的时候,我已经习惯了好的8.3格式的MS/DOS文件。
我仍然可以在Windows 7框中看到(并使用它们),控制台(CMD.EXE)窗口中有CMD.EXE。这种格式只使用ASCII大写字符和tilda (~),因此可以用作解决办法:只需在环境变量PYTHONHOME中声明8.3路径,并使用该8.3路径启动python。
顺便说一句,PYTHONHOME最好使用既不包含特殊字符,也不包含nore空格的路径。它可以工作,但它可能会导致其他模块的问题。
发布于 2016-05-25 11:28:43
查看 function version 2.7给出了以下定义:
PyObject *
PyImport_ImportModule(const char *name)
{
PyObject *pname;
PyObject *result;
pname = PyString_FromString(name);
if (pname == NULL)
return NULL;
result = PyImport_Import(pname);
Py_DECREF(pname);
return result;
}在查看 function version 3.5时,除了使用
pname = PyUnicode_FromString(name);而不是
pname = PyString_FromString(name);您可以查看PyString_FromString和PyUnicode_FromString,但是很明显,python2不使用unicode,python3也使用unicode,但是我还没有发现这究竟是如何/在哪里导致您描述的行为的。
function (version 2.7)只像这样使用module_name:
r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
globals, silly_list, 0, NULL);转移责任..。
https://stackoverflow.com/questions/37315999
复制相似问题