使用Py_SetPath()让Python在不同的位置查找Lib

使用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

我在一个应用程序中嵌入了Python,
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;