Я пишу пользовательский модуль PAM.
Я написал файл общего объекта (.so), как требуется для Linux -PAM. Этот файл .so делает вызов встроенным Python, чтобы открыть мое распознавание лиц, и, в зависимости от результата, вернет PAM_SUCCESS или PAM_AUTH_ERR
В файле /etc/pam.d/sudo, который у меня есть сказал PAM, что файл находится в (/home/berns/2020-ca326-cberns-fileencryption-with-opencv/PAM/pam_authnew.so). Это нормально, так как, когда набирается sudo, я вижу, как печатается мое личное заявление об ошибке, в котором говорится, что он не может загрузить файл Python.
Проблема, с которой я столкнулся, заключается в том, что код распознавания лиц находится в совершенно ином каталоге, из которого находится файл .so. (../Code/facial). Я использовал команду chdir в своем коде C, но, похоже, он не меняет каталог на тот, где находятся лицевые файлы Python, чтобы обеспечить успех или нет.
Есть ли что-то, чего мне не хватает?
C код, указанный ниже:
#define PAM_SM_AUTH
#define PAM_SM_ACCOUNT
#define PAM_SM_SESSION
#define GetCurrentDir getcwd
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <security/pam_appl.h>
#include <security/pam_modules.h>
#include </usr/include/python3.6m/Python.h>
int main(int argc, char** argv){
}
PAM_EXTERN int pam_sm_authenticate( pam_handle_t *pamh, int flags,int argc, const char **argv ){
char *result;
chdir("../code/facial"); // this changes it to the correct directory to execute
//dlopen("/usr/lib/x86_64-linux-gnu/libpython3.6m.so",RTLD_LAZY | RTLD_GLOBAL);
Py_Initialize(); // Starts python interpreter
PyRun_SimpleString("import os\nimport sys\nsys.path.append(os.getcwd())"); // lets python know where we are
PyObject *mymod, *func1, *ret1;
mymod = PyImport_ImportModule("pam_detect"); // This is the .py
if (mymod != NULL){ // check if the file file was loaded
func1 = PyObject_GetAttrString(mymod, "detect"); // hel is the function name in the file you declared earlier
ret1 = PyObject_CallObject(func1, NULL); // Null because the function doesnt take an argument.
result = PyUnicode_AsUTF8(ret1);
//printf("%s\n", result);
if (strcmp(result, "success") == 0){
Py_Finalize();
return PAM_SUCCESS;
}
else{
Py_Finalize();
return PAM_AUTH_ERR;
}
}
else{
printf("Error: can't find file!\n");
}
Py_Finalize();
return 0;
}
Ошибка ответа от терминала ниже

Is это из-за того, что дочерние процессы не меняют каталоги вне своего собственного рабочего пространства?
Также стоит отметить, что если я скомпилирую код C БЕЗ того, чтобы сделать его .so, я смогу отлично загрузить файлы Python и узнаю мое лицо.