Introducing python virtualenv configuration.

New parameter 'home' for python application allows to configure
application-specific virtualenv path.

This closes #15 issue on GitHub.
This commit is contained in:
Max Romanov
2017-11-29 18:48:55 +03:00
parent ec4ad8780e
commit 3781950bad
4 changed files with 44 additions and 0 deletions

View File

@@ -34,6 +34,7 @@ typedef struct nxt_common_app_conf_s nxt_common_app_conf_t;
typedef struct { typedef struct {
char *home;
nxt_str_t path; nxt_str_t path;
nxt_str_t module; nxt_str_t module;
} nxt_python_app_conf_t; } nxt_python_app_conf_t;

View File

@@ -118,6 +118,11 @@ static nxt_conf_vldt_object_t nxt_conf_vldt_python_members[] = {
NULL, NULL,
NULL }, NULL },
{ nxt_string("home"),
NXT_CONF_STRING,
NULL,
NULL },
{ nxt_string("path"), { nxt_string("path"),
NXT_CONF_STRING, NXT_CONF_STRING,
NULL, NULL,
@@ -545,3 +550,5 @@ nxt_conf_vldt_group(nxt_conf_validation_t *vldt, char *group)
return NXT_ERROR; return NXT_ERROR;
} }

View File

@@ -120,6 +120,12 @@ static nxt_conf_map_t nxt_common_app_conf[] = {
offsetof(nxt_common_app_conf_t, workers), offsetof(nxt_common_app_conf_t, workers),
}, },
{
nxt_string("home"),
NXT_CONF_MAP_CSTRZ,
offsetof(nxt_common_app_conf_t, u.python.home),
},
{ {
nxt_string("path"), nxt_string("path"),
NXT_CONF_MAP_STR, NXT_CONF_MAP_STR,

View File

@@ -177,6 +177,12 @@ static PyObject *nxt_py_application;
static PyObject *nxt_py_start_resp_obj; static PyObject *nxt_py_start_resp_obj;
static PyObject *nxt_py_environ_ptyp; static PyObject *nxt_py_environ_ptyp;
#if PY_MAJOR_VERSION == 3
static wchar_t *nxt_py_home;
#else
static char *nxt_py_home;
#endif
static nxt_python_run_ctx_t *nxt_python_run_ctx; static nxt_python_run_ctx_t *nxt_python_run_ctx;
@@ -194,6 +200,26 @@ nxt_python_init(nxt_task_t *task, nxt_common_app_conf_t *conf)
return NXT_ERROR; return NXT_ERROR;
} }
if (c->home != NULL) {
size_t len;
len = nxt_strlen(c->home);
nxt_py_home = nxt_malloc(sizeof(*nxt_py_home) * (len + 1));
if (nxt_slow_path(nxt_py_home == NULL)) {
nxt_log_emerg(task->log, "Failed to allocate buffer for home path");
return NXT_ERROR;
}
#if PY_MAJOR_VERSION == 3
mbstowcs(nxt_py_home, c->home, len + 1);
#else
nxt_memcpy(nxt_py_home, c->home, len + 1);
#endif
Py_SetPythonHome(nxt_py_home);
}
Py_InitializeEx(0); Py_InitializeEx(0);
obj = NULL; obj = NULL;
@@ -301,6 +327,10 @@ fail:
Py_XDECREF(obj); Py_XDECREF(obj);
Py_XDECREF(module); Py_XDECREF(module);
if (nxt_py_home != NULL) {
nxt_free(nxt_py_home);
}
return NXT_ERROR; return NXT_ERROR;
} }