使用Py_SetPath()让Python在不同的位置查找Lib
我在一个应用程序中嵌入了Python,使用Py_SetPath()让Python在不同的位置查找Lib,python,python-3.x,python-module,lib,Python,Python 3.x,Python Module,Lib,我在一个应用程序中嵌入了Python,foo.exe。当它运行时,会调用Python并立即查找Lib。我能让它工作的唯一方法是将Lib(Python的模块目录库)放在foo.exe位置 是否有一种方法可以将Python重定向到其他地方,例如Python/Lib?我无法更改路径(这是windows),我不想破解Python源代码 基本上,我无法让Py_SetPath()工作,也无法在互联网上找到任何实际的例子 更新: 好的,这是有效的: #define MYMAXPATHLEN 1000
foo.exe
。当它运行时,会调用Python并立即查找Lib
。我能让它工作的唯一方法是将Lib
(Python的模块目录库)放在foo.exe
位置
是否有一种方法可以将Python重定向到其他地方,例如Python/Lib
?我无法更改路径(这是windows),我不想破解Python源代码
基本上,我无法让Py_SetPath()工作,也无法在互联网上找到任何实际的例子
更新:
好的,这是有效的:
#define MYMAXPATHLEN 1000
static wchar_t progpath[MYMAXPATHLEN + 1];
wchar_t* pdir = L"\\My_New_Location\\Python\\Lib";
wchar_t* pdelim = L";";
wchar_t* pypath = NULL;
GetModuleFileNameW(NULL, progpath, MYMAXPATHLEN);
reduce(progpath);
wcscat(progpath,pdir);
// I get the present module path and add the extra dirs to access Lib code
wcscat(progpath, pdelim); // I add a path delimiter
pypath = Py_GetPath();
wcscat(progpath, pypath);
// I add the paths that Py_GetPath() produces.
Py_SetPath(progpath);
Py_Initialize();
我还调用Py_SetProgramName();在Py_初始化()之后;我不确定是否需要所有这些额外的东西,但较小的解决方案似乎失败了
似乎在初始化之后调用Py_SetProgamName()对于使嵌入调用正常工作非常重要。导入库之前,请运行以下行:
sys.path.append('C:\path to Lib')
可以找到详细信息。我让它工作(在Linux上)并执行以下操作:
// method to inspect PyObjects
static void reprint(PyObject *obj)
{
PyObject* repr = PyObject_Repr(obj);
PyObject* str = PyUnicode_AsEncodedString(repr, "utf-8", "~E~");
const char *bytes = PyBytes_AS_STRING(str);
printf("REPR: %s\n", bytes);
Py_XDECREF(repr);
Py_XDECREF(str);
}
需要注意的几点:
如果查看Python模块getpath.c
,您将看到以下缓冲区:
static wchar_t prefix[MAXPATHLEN+1];
static wchar_t exec_prefix[MAXPATHLEN+1];
static wchar_t progpath[MAXPATHLEN+1];
Py_GetProgramFullPath等方法执行以下操作:
if (!module_search_path)
calculate_path();
return progpath;
…因此,可以使用这些方法获取缓冲区指针,并将值直接输入缓冲区。请注意,目前只有以这种方式实现getpath时才有可能做到这一点
lib dynload
需要确保某些模块(例如datetime)可以被拉入
还要注意,这种方法确保可以找到
../python3.x/encodings
目录,这可以防止Py_Initialize中的运行时错误我认为必须在进程的早期(某个Python API调用?)发生。Python在向其发送命令之前失败。如果Lib
不存在,然后,也许您可以从Python代码中创建一个连接点mklink/jc:\…\Lib c:\…\Python\Lib
:“Py\u SetPath()可用于重写此机制。在调用Py\u Initialize之前,使用分号分隔的路径调用Py\u SetPath。”
static wchar_t prefix[MAXPATHLEN+1];
static wchar_t exec_prefix[MAXPATHLEN+1];
static wchar_t progpath[MAXPATHLEN+1];
if (!module_search_path)
calculate_path();
return progpath;