blob: ade90636695c9a71fd81ec5ed4e6612fe7bbbbb7 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* System module */
3
4/*
5Various bits of information used by the interpreter are collected in
6module 'sys'.
Guido van Rossum3f5da241990-12-20 15:06:42 +00007Function member:
Guido van Rossumcc8914f1995-03-20 15:09:40 +00008- exit(sts): raise SystemExit
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00009Data members:
10- stdin, stdout, stderr: standard file objects
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011- modules: the table of modules (dictionary)
Guido van Rossum3f5da241990-12-20 15:06:42 +000012- path: module search path (list of strings)
13- argv: script arguments (list of strings)
14- ps1, ps2: optional primary and secondary prompts (strings)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000015*/
16
Guido van Rossum65bf9f21997-04-29 18:33:38 +000017#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000018
Guido van Rossume2437a11992-03-23 18:20:18 +000019#include "osdefs.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020
Guido van Rossum1254d791997-05-20 15:57:25 +000021#ifdef HAVE_UNISTD_H
Guido van Rossumc474dea1997-04-25 15:38:31 +000022#include <unistd.h>
23#endif
24
Guido van Rossum9b38a141996-09-11 23:12:24 +000025#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +000026extern void *PyWin_DLLhModule;
Guido van Rossum6c1e5f21997-09-29 23:34:23 +000027/* A string loaded from the DLL at startup: */
28extern const char *PyWin_DLLVersionString;
Guido van Rossumc606fe11996-04-09 02:37:57 +000029#endif
30
Guido van Rossum65bf9f21997-04-29 18:33:38 +000031PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000032PySys_GetObject(char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033{
Guido van Rossum25ce5661997-08-02 03:10:38 +000034 PyThreadState *tstate = PyThreadState_Get();
35 PyObject *sd = tstate->interp->sysdict;
Guido van Rossumbe203361999-10-05 22:17:41 +000036 if (sd == NULL)
37 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +000038 return PyDict_GetItemString(sd, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039}
40
41FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000042PySys_GetFile(char *name, FILE *def)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043{
44 FILE *fp = NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +000045 PyObject *v = PySys_GetObject(name);
46 if (v != NULL && PyFile_Check(v))
47 fp = PyFile_AsFile(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048 if (fp == NULL)
49 fp = def;
50 return fp;
51}
52
53int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000054PySys_SetObject(char *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055{
Guido van Rossum25ce5661997-08-02 03:10:38 +000056 PyThreadState *tstate = PyThreadState_Get();
57 PyObject *sd = tstate->interp->sysdict;
Guido van Rossum5ad58c61992-01-26 18:15:48 +000058 if (v == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +000059 if (PyDict_GetItemString(sd, name) == NULL)
Guido van Rossum5ad58c61992-01-26 18:15:48 +000060 return 0;
61 else
Guido van Rossum25ce5661997-08-02 03:10:38 +000062 return PyDict_DelItemString(sd, name);
Guido van Rossum5ad58c61992-01-26 18:15:48 +000063 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064 else
Guido van Rossum25ce5661997-08-02 03:10:38 +000065 return PyDict_SetItemString(sd, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066}
67
Guido van Rossum65bf9f21997-04-29 18:33:38 +000068static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000069sys_exc_info(PyObject *self, PyObject *args)
Guido van Rossuma027efa1997-05-05 20:56:21 +000070{
71 PyThreadState *tstate;
Guido van Rossumffc0f4f2000-03-31 00:38:29 +000072 if (!PyArg_ParseTuple(args, ":exc_info"))
Guido van Rossuma027efa1997-05-05 20:56:21 +000073 return NULL;
74 tstate = PyThreadState_Get();
Guido van Rossuma027efa1997-05-05 20:56:21 +000075 return Py_BuildValue(
76 "(OOO)",
77 tstate->exc_type != NULL ? tstate->exc_type : Py_None,
78 tstate->exc_value != NULL ? tstate->exc_value : Py_None,
79 tstate->exc_traceback != NULL ?
80 tstate->exc_traceback : Py_None);
81}
82
Guido van Rossumc3bc31e1998-06-27 19:43:25 +000083static char exc_info_doc[] =
84"exc_info() -> (type, value, traceback)\n\
85\n\
86Return information about the exception that is currently being handled.\n\
87This should be called from inside an except clause only.";
88
Guido van Rossuma027efa1997-05-05 20:56:21 +000089static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000090sys_exit(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000091{
Guido van Rossum6a468bf1991-12-31 13:15:35 +000092 /* Raise SystemExit so callers may catch it or clean up. */
Guido van Rossum65bf9f21997-04-29 18:33:38 +000093 PyErr_SetObject(PyExc_SystemExit, args);
Guido van Rossum6a468bf1991-12-31 13:15:35 +000094 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000095}
96
Guido van Rossumc3bc31e1998-06-27 19:43:25 +000097static char exit_doc[] =
98"exit([status])\n\
99\n\
100Exit the interpreter by raising SystemExit(status).\n\
101If the status is omitted or None, it defaults to zero (i.e., success).\n\
102If the status numeric, it will be used as the system exit status.\n\
103If it is another kind of object, it will be printed and the system\n\
104exit status will be one (i.e., failure).";
105
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000106static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000107sys_getdefaultencoding(PyObject *self, PyObject *args)
Fred Drake8b4d01d2000-05-09 19:57:01 +0000108{
Marc-André Lemburg99964b82000-06-07 09:13:41 +0000109 if (!PyArg_ParseTuple(args, ":getdefaultencoding"))
Fred Drake8b4d01d2000-05-09 19:57:01 +0000110 return NULL;
111 return PyString_FromString(PyUnicode_GetDefaultEncoding());
112}
113
Marc-André Lemburg99964b82000-06-07 09:13:41 +0000114static char getdefaultencoding_doc[] =
115"getdefaultencoding() -> string\n\
Fred Drake8b4d01d2000-05-09 19:57:01 +0000116\n\
117Return the current default string encoding used by the Unicode \n\
118implementation.";
119
120static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000121sys_setdefaultencoding(PyObject *self, PyObject *args)
Fred Drake8b4d01d2000-05-09 19:57:01 +0000122{
123 char *encoding;
Marc-André Lemburg99964b82000-06-07 09:13:41 +0000124 if (!PyArg_ParseTuple(args, "s:setdefaultencoding", &encoding))
Fred Drake8b4d01d2000-05-09 19:57:01 +0000125 return NULL;
126 if (PyUnicode_SetDefaultEncoding(encoding))
127 return NULL;
128 Py_INCREF(Py_None);
129 return Py_None;
130}
131
Marc-André Lemburg99964b82000-06-07 09:13:41 +0000132static char setdefaultencoding_doc[] =
133"setdefaultencoding(encoding)\n\
Fred Drake8b4d01d2000-05-09 19:57:01 +0000134\n\
135Set the current default string encoding used by the Unicode implementation.";
136
137static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000138sys_settrace(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +0000139{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000140 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000141 if (args == Py_None)
Guido van Rossume2437a11992-03-23 18:20:18 +0000142 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000143 else
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000144 Py_XINCREF(args);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000145 Py_XDECREF(tstate->sys_tracefunc);
146 tstate->sys_tracefunc = args;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000147 Py_INCREF(Py_None);
148 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000149}
150
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000151static char settrace_doc[] =
152"settrace(function)\n\
153\n\
154Set the global debug tracing function. It will be called on each\n\
155function call. See the debugger chapter in the library manual.";
156
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000157static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000158sys_setprofile(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +0000159{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000160 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000161 if (args == Py_None)
Guido van Rossume2437a11992-03-23 18:20:18 +0000162 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000163 else
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000164 Py_XINCREF(args);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000165 Py_XDECREF(tstate->sys_profilefunc);
166 tstate->sys_profilefunc = args;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000167 Py_INCREF(Py_None);
168 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000169}
170
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000171static char setprofile_doc[] =
172"setprofile(function)\n\
173\n\
174Set the profiling function. It will be called on each function call\n\
175and return. See the profiler chapter in the library manual.";
176
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000177static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000178sys_setcheckinterval(PyObject *self, PyObject *args)
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000179{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000180 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum43713e52000-02-29 13:59:29 +0000181 if (!PyArg_ParseTuple(args, "i:setcheckinterval", &tstate->interp->checkinterval))
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000182 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000183 Py_INCREF(Py_None);
184 return Py_None;
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000185}
186
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000187static char setcheckinterval_doc[] =
188"setcheckinterval(n)\n\
189\n\
190Tell the Python interpreter to check for asynchronous events every\n\
191n instructions. This also affects how often thread switches occur.";
192
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000193static PyObject *
194sys_setrecursionlimit(PyObject *self, PyObject *args)
195{
196 int new_limit;
197 if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit))
198 return NULL;
199 if (new_limit <= 0) {
200 PyErr_SetString(PyExc_ValueError,
201 "recursion limit must be positive");
202 return NULL;
203 }
204 Py_SetRecursionLimit(new_limit);
205 Py_INCREF(Py_None);
206 return Py_None;
207}
208
209static char setrecursionlimit_doc[] =
210"setrecursionlimit(n)\n\
211\n\
212Set the maximum depth of the Python interpreter stack to n. This\n\
213limit prevents infinite recursion from causing an overflow of the C\n\
214stack and crashing Python. The highest possible limit is platform-\n\
215dependent.";
216
217static PyObject *
218sys_getrecursionlimit(PyObject *self, PyObject *args)
219{
220 if (!PyArg_ParseTuple(args, ":getrecursionlimit"))
221 return NULL;
222 return PyInt_FromLong(Py_GetRecursionLimit());
223}
224
225static char getrecursionlimit_doc[] =
226"getrecursionlimit()\n\
227\n\
228Return the current value of the recursion limit, the maximum depth\n\
229of the Python interpreter stack. This limit prevents infinite\n\
230recursion from causing an overflow of the C stack and crashing Python.";
231
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000232#ifdef USE_MALLOPT
233/* Link with -lmalloc (or -lmpc) on an SGI */
234#include <malloc.h>
235
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000236static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000237sys_mdebug(PyObject *self, PyObject *args)
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000238{
239 int flag;
Guido van Rossumffc0f4f2000-03-31 00:38:29 +0000240 if (!PyArg_ParseTuple(args, "i:mdebug", &flag))
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000241 return NULL;
242 mallopt(M_DEBUG, flag);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000243 Py_INCREF(Py_None);
244 return Py_None;
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000245}
246#endif /* USE_MALLOPT */
247
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000248static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000249sys_getrefcount(PyObject *self, PyObject *args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000250{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000251 PyObject *arg;
Guido van Rossumffc0f4f2000-03-31 00:38:29 +0000252 if (!PyArg_ParseTuple(args, "O:getrefcount", &arg))
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000253 return NULL;
Mark Hammond440d8982000-06-20 08:12:48 +0000254 return PyInt_FromLong(arg->ob_refcnt);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000255}
256
Mark Hammond440d8982000-06-20 08:12:48 +0000257#ifdef Py_TRACE_REFS
258static PyObject *
259sys_gettotalrefcount(PyObject *self, PyObject *args)
260{
261 extern long _Py_RefTotal;
262 if (!PyArg_ParseTuple(args, ":gettotalrefcount"))
263 return NULL;
264 return PyInt_FromLong(_Py_RefTotal);
265}
266
267#endif /* Py_TRACE_REFS */
268
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000269static char getrefcount_doc[] =
270"getrefcount(object) -> integer\n\
271\n\
272Return the current reference count for the object. This includes the\n\
273temporary reference in the argument list, so it is at least 2.";
274
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000275#ifdef COUNT_ALLOCS
276static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000277sys_getcounts(PyObject *self, PyObject *args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000278{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000279 extern PyObject *get_counts(void);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000280
Guido van Rossumffc0f4f2000-03-31 00:38:29 +0000281 if (!PyArg_ParseTuple(args, ":getcounts"))
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000282 return NULL;
283 return get_counts();
284}
285#endif
286
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000287#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000288/* Defined in objects.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000289extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000290#endif
Guido van Rossumded690f1996-05-24 20:48:31 +0000291
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000292#ifdef DYNAMIC_EXECUTION_PROFILE
293/* Defined in ceval.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000294extern PyObject *_Py_GetDXProfile(PyObject *, PyObject *);
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000295#endif
296
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000297static PyMethodDef sys_methods[] = {
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000298 /* Might as well keep this in alphabetic order */
Guido van Rossumffc0f4f2000-03-31 00:38:29 +0000299 {"exc_info", sys_exc_info, 1, exc_info_doc},
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000300 {"exit", sys_exit, 0, exit_doc},
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000301 {"getdefaultencoding", sys_getdefaultencoding, 1,
302 getdefaultencoding_doc},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000303#ifdef COUNT_ALLOCS
Guido van Rossumffc0f4f2000-03-31 00:38:29 +0000304 {"getcounts", sys_getcounts, 1},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000305#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000306#ifdef DYNAMIC_EXECUTION_PROFILE
307 {"getdxp", _Py_GetDXProfile, 1},
308#endif
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000309#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000310 {"getobjects", _Py_GetObjects, 1},
Mark Hammond440d8982000-06-20 08:12:48 +0000311 {"gettotalrefcount", sys_gettotalrefcount, 1},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000312#endif
Guido van Rossumffc0f4f2000-03-31 00:38:29 +0000313 {"getrefcount", sys_getrefcount, 1, getrefcount_doc},
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000314 {"getrecursionlimit", sys_getrecursionlimit, 1,
315 getrecursionlimit_doc},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000316#ifdef USE_MALLOPT
Guido van Rossumffc0f4f2000-03-31 00:38:29 +0000317 {"mdebug", sys_mdebug, 1},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000318#endif
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000319 {"setdefaultencoding", sys_setdefaultencoding, 1,
320 setdefaultencoding_doc},
321 {"setcheckinterval", sys_setcheckinterval, 1,
322 setcheckinterval_doc},
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000323 {"setprofile", sys_setprofile, 0, setprofile_doc},
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000324 {"setrecursionlimit", sys_setrecursionlimit, 1,
325 setrecursionlimit_doc},
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000326 {"settrace", sys_settrace, 0, settrace_doc},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000327 {NULL, NULL} /* sentinel */
328};
329
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000330static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000331list_builtin_module_names(void)
Guido van Rossum34679b71993-01-26 13:33:44 +0000332{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000333 PyObject *list = PyList_New(0);
Guido van Rossum34679b71993-01-26 13:33:44 +0000334 int i;
335 if (list == NULL)
336 return NULL;
Guido van Rossum25c649f1997-11-04 17:04:34 +0000337 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000338 PyObject *name = PyString_FromString(
Guido van Rossum25c649f1997-11-04 17:04:34 +0000339 PyImport_Inittab[i].name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000340 if (name == NULL)
341 break;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000342 PyList_Append(list, name);
343 Py_DECREF(name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000344 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000345 if (PyList_Sort(list) != 0) {
346 Py_DECREF(list);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000347 list = NULL;
348 }
Guido van Rossum8f49e121997-01-06 22:55:54 +0000349 if (list) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000350 PyObject *v = PyList_AsTuple(list);
351 Py_DECREF(list);
Guido van Rossum8f49e121997-01-06 22:55:54 +0000352 list = v;
353 }
Guido van Rossum34679b71993-01-26 13:33:44 +0000354 return list;
355}
356
Guido van Rossum40552d01998-08-06 03:34:39 +0000357/* XXX This doc string is too long to be a single string literal in VC++ 5.0.
358 Two literals concatenated works just fine. If you have a K&R compiler
359 or other abomination that however *does* understand longer strings,
360 get rid of the !!! comment in the middle and the quotes that surround it. */
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000361static char sys_doc[] =
362"This module provides access to some objects used or maintained by the\n\
363interpreter and to functions that interact strongly with the interpreter.\n\
364\n\
365Dynamic objects:\n\
366\n\
367argv -- command line arguments; argv[0] is the script pathname if known\n\
368path -- module search path; path[0] is the script directory, else ''\n\
369modules -- dictionary of loaded modules\n\
370exitfunc -- you may set this to a function to be called when Python exits\n\
371\n\
372stdin -- standard input file object; used by raw_input() and input()\n\
373stdout -- standard output file object; used by the print statement\n\
374stderr -- standard error object; used for error messages\n\
375 By assigning another file object (or an object that behaves like a file)\n\
376 to one of these, it is possible to redirect all of the interpreter's I/O.\n\
377\n\
378last_type -- type of last uncaught exception\n\
379last_value -- value of last uncaught exception\n\
380last_traceback -- traceback of last uncaught exception\n\
381 These three are only available in an interactive session after a\n\
382 traceback has been printed.\n\
383\n\
384exc_type -- type of exception currently being handled\n\
385exc_value -- value of exception currently being handled\n\
386exc_traceback -- traceback of exception currently being handled\n\
387 The function exc_info() should be used instead of these three,\n\
388 because it is thread-safe.\n\
Guido van Rossuma71b5f41999-01-14 19:07:00 +0000389"
390#ifndef MS_WIN16
391/* Concatenating string here */
392"\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000393Static objects:\n\
394\n\
395maxint -- the largest supported integer (the smallest is -maxint-1)\n\
396builtin_module_names -- tuple of module names built into this intepreter\n\
Fred Drake801c08d2000-04-13 15:29:10 +0000397version -- the version of this interpreter as a string\n\
398version_info -- version information as a tuple\n\
399hexversion -- version information encoded as a single integer\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000400copyright -- copyright notice pertaining to this interpreter\n\
401platform -- platform identifier\n\
402executable -- pathname of this Python interpreter\n\
403prefix -- prefix used to find the Python library\n\
404exec_prefix -- prefix used to find the machine-specific Python library\n\
405dllhandle -- [Windows only] integer handle of the Python DLL\n\
406winver -- [Windows only] version number of the Python DLL\n\
407__stdin__ -- the original stdin; don't use!\n\
408__stdout__ -- the original stdout; don't use!\n\
409__stderr__ -- the original stderr; don't use!\n\
410\n\
411Functions:\n\
412\n\
413exc_info() -- return thread-safe information about the current exception\n\
414exit() -- exit the interpreter by raising SystemExit\n\
415getrefcount() -- return the reference count for an object (plus one :-)\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000416getrecursionlimit() -- return the max recursion depth for the interpreter\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000417setcheckinterval() -- control how often the interpreter checks for events\n\
418setprofile() -- set the global profiling function\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000419setrecursionlimit() -- set the max recursion depth for the interpreter\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000420settrace() -- set the global debug tracing function\n\
Fred Drakeccede592000-08-14 20:59:57 +0000421"
Guido van Rossuma71b5f41999-01-14 19:07:00 +0000422#endif
Fred Drakeccede592000-08-14 20:59:57 +0000423/* end of sys_doc */ ;
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000424
Guido van Rossum25ce5661997-08-02 03:10:38 +0000425PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000426_PySys_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000428 PyObject *m, *v, *sysdict;
429 PyObject *sysin, *sysout, *syserr;
Fred Drake6d27c1e2000-04-13 20:03:20 +0000430 char *s;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000431
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000432 m = Py_InitModule3("sys", sys_methods, sys_doc);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000433 sysdict = PyModule_GetDict(m);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000434
435 sysin = PyFile_FromFile(stdin, "<stdin>", "r", NULL);
436 sysout = PyFile_FromFile(stdout, "<stdout>", "w", NULL);
437 syserr = PyFile_FromFile(stderr, "<stderr>", "w", NULL);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000438 if (PyErr_Occurred())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000439 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000440 PyDict_SetItemString(sysdict, "stdin", sysin);
441 PyDict_SetItemString(sysdict, "stdout", sysout);
442 PyDict_SetItemString(sysdict, "stderr", syserr);
Guido van Rossumbd36dba1998-02-19 20:53:06 +0000443 /* Make backup copies for cleanup */
444 PyDict_SetItemString(sysdict, "__stdin__", sysin);
445 PyDict_SetItemString(sysdict, "__stdout__", sysout);
446 PyDict_SetItemString(sysdict, "__stderr__", syserr);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000447 Py_XDECREF(sysin);
448 Py_XDECREF(sysout);
449 Py_XDECREF(syserr);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000450 PyDict_SetItemString(sysdict, "version",
451 v = PyString_FromString(Py_GetVersion()));
Barry Warsaw54892c41999-01-27 16:33:19 +0000452 Py_XDECREF(v);
Guido van Rossume0d7dae1999-01-03 12:55:39 +0000453 PyDict_SetItemString(sysdict, "hexversion",
454 v = PyInt_FromLong(PY_VERSION_HEX));
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000455 Py_XDECREF(v);
Fred Drake93a20bf2000-04-13 17:44:51 +0000456 /*
457 * These release level checks are mutually exclusive and cover
458 * the field, so don't get too fancy with the pre-processor!
459 */
460#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
Fred Drake6d27c1e2000-04-13 20:03:20 +0000461 s = "alpha";
Fred Drake592f2d62000-08-31 15:21:11 +0000462#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
Fred Drake6d27c1e2000-04-13 20:03:20 +0000463 s = "beta";
Fred Drake592f2d62000-08-31 15:21:11 +0000464#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
Fred Drake6d27c1e2000-04-13 20:03:20 +0000465 s = "candidate";
Fred Drake592f2d62000-08-31 15:21:11 +0000466#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
Fred Drake6d27c1e2000-04-13 20:03:20 +0000467 s = "final";
Fred Drake93a20bf2000-04-13 17:44:51 +0000468#endif
Fred Drake801c08d2000-04-13 15:29:10 +0000469 PyDict_SetItemString(sysdict, "version_info",
Fred Drake6d27c1e2000-04-13 20:03:20 +0000470 v = Py_BuildValue("iiisi", PY_MAJOR_VERSION,
Fred Drake801c08d2000-04-13 15:29:10 +0000471 PY_MINOR_VERSION,
Fred Drake6d27c1e2000-04-13 20:03:20 +0000472 PY_MICRO_VERSION, s,
Fred Drake93a20bf2000-04-13 17:44:51 +0000473 PY_RELEASE_SERIAL));
Fred Drake801c08d2000-04-13 15:29:10 +0000474 Py_XDECREF(v);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000475 PyDict_SetItemString(sysdict, "copyright",
476 v = PyString_FromString(Py_GetCopyright()));
477 Py_XDECREF(v);
478 PyDict_SetItemString(sysdict, "platform",
479 v = PyString_FromString(Py_GetPlatform()));
480 Py_XDECREF(v);
Guido van Rossumb2c8ec41997-05-22 20:41:20 +0000481 PyDict_SetItemString(sysdict, "executable",
482 v = PyString_FromString(Py_GetProgramFullPath()));
483 Py_XDECREF(v);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000484 PyDict_SetItemString(sysdict, "prefix",
485 v = PyString_FromString(Py_GetPrefix()));
486 Py_XDECREF(v);
487 PyDict_SetItemString(sysdict, "exec_prefix",
488 v = PyString_FromString(Py_GetExecPrefix()));
489 Py_XDECREF(v);
490 PyDict_SetItemString(sysdict, "maxint",
491 v = PyInt_FromLong(PyInt_GetMax()));
492 Py_XDECREF(v);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000493 PyDict_SetItemString(sysdict, "builtin_module_names",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000494 v = list_builtin_module_names());
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000495 Py_XDECREF(v);
Fred Drake099325e2000-08-14 15:47:03 +0000496 {
497 /* Assumes that longs are at least 2 bytes long.
498 Should be safe! */
499 unsigned long number = 1;
Fred Drakea2b6ad62000-08-15 04:24:43 +0000500 char *value;
Fred Drake099325e2000-08-14 15:47:03 +0000501
502 s = (char *) &number;
503 if (s[0] == 0)
Fred Drakea2b6ad62000-08-15 04:24:43 +0000504 value = "big";
Fred Drake099325e2000-08-14 15:47:03 +0000505 else
Fred Drakea2b6ad62000-08-15 04:24:43 +0000506 value = "little";
507 PyDict_SetItemString(sysdict, "byteorder",
Barry Warsawf2581c92000-08-16 23:03:57 +0000508 v = PyString_FromString(value));
509 Py_XDECREF(v);
Fred Drake099325e2000-08-14 15:47:03 +0000510 }
Guido van Rossum8b9ea871996-08-23 18:14:47 +0000511#ifdef MS_COREDLL
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000512 PyDict_SetItemString(sysdict, "dllhandle",
Guido van Rossum582acec2000-06-28 22:07:35 +0000513 v = PyLong_FromVoidPtr(PyWin_DLLhModule));
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000514 Py_XDECREF(v);
515 PyDict_SetItemString(sysdict, "winver",
Guido van Rossum6c1e5f21997-09-29 23:34:23 +0000516 v = PyString_FromString(PyWin_DLLVersionString));
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000517 Py_XDECREF(v);
Guido van Rossumc606fe11996-04-09 02:37:57 +0000518#endif
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000519 if (PyErr_Occurred())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000520 return NULL;
521 return m;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000522}
523
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000524static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000525makepathobject(char *path, int delim)
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000526{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000527 int i, n;
528 char *p;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000529 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000530
531 n = 1;
532 p = path;
533 while ((p = strchr(p, delim)) != NULL) {
534 n++;
535 p++;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000536 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000537 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000538 if (v == NULL)
539 return NULL;
540 for (i = 0; ; i++) {
541 p = strchr(path, delim);
542 if (p == NULL)
543 p = strchr(path, '\0'); /* End of string */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000544 w = PyString_FromStringAndSize(path, (int) (p - path));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000545 if (w == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000546 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000547 return NULL;
548 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000549 PyList_SetItem(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000550 if (*p == '\0')
551 break;
552 path = p+1;
553 }
554 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000555}
556
557void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000558PySys_SetPath(char *path)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000559{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000560 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000561 if ((v = makepathobject(path, DELIM)) == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000562 Py_FatalError("can't create sys.path");
563 if (PySys_SetObject("path", v) != 0)
564 Py_FatalError("can't assign sys.path");
565 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000566}
567
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000568static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000569makeargvobject(int argc, char **argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000570{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000571 PyObject *av;
Guido van Rossumee3a2991992-01-14 18:42:53 +0000572 if (argc <= 0 || argv == NULL) {
573 /* Ensure at least one (empty) argument is seen */
574 static char *empty_argv[1] = {""};
575 argv = empty_argv;
576 argc = 1;
577 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000578 av = PyList_New(argc);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000579 if (av != NULL) {
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000580 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000581 for (i = 0; i < argc; i++) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000582 PyObject *v = PyString_FromString(argv[i]);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000583 if (v == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000584 Py_DECREF(av);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000585 av = NULL;
586 break;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000587 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000588 PyList_SetItem(av, i, v);
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000589 }
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000590 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000591 return av;
592}
593
594void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000595PySys_SetArgv(int argc, char **argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000596{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000597 PyObject *av = makeargvobject(argc, argv);
598 PyObject *path = PySys_GetObject("path");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000599 if (av == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000600 Py_FatalError("no mem for sys.argv");
601 if (PySys_SetObject("argv", av) != 0)
602 Py_FatalError("can't assign sys.argv");
Guido van Rossum94a96671996-07-30 20:35:50 +0000603 if (path != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000604 char *argv0 = argv[0];
Guido van Rossum94a96671996-07-30 20:35:50 +0000605 char *p = NULL;
Guido van Rossumcc883411996-09-10 14:44:21 +0000606 int n = 0;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000607 PyObject *a;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000608#ifdef HAVE_READLINK
609 char link[MAXPATHLEN+1];
610 char argv0copy[2*MAXPATHLEN+1];
611 int nr = 0;
612 if (argc > 0 && argv0 != NULL)
613 nr = readlink(argv0, link, MAXPATHLEN);
614 if (nr > 0) {
615 /* It's a symlink */
616 link[nr] = '\0';
617 if (link[0] == SEP)
618 argv0 = link; /* Link to absolute path */
619 else if (strchr(link, SEP) == NULL)
620 ; /* Link without path */
621 else {
622 /* Must join(dirname(argv0), link) */
623 char *q = strrchr(argv0, SEP);
624 if (q == NULL)
625 argv0 = link; /* argv0 without path */
626 else {
627 /* Must make a copy */
628 strcpy(argv0copy, argv0);
629 q = strrchr(argv0copy, SEP);
630 strcpy(q+1, link);
631 argv0 = argv0copy;
632 }
633 }
634 }
635#endif /* HAVE_READLINK */
Guido van Rossumcc883411996-09-10 14:44:21 +0000636#if SEP == '\\' /* Special case for MS filename syntax */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000637 if (argc > 0 && argv0 != NULL) {
Guido van Rossumcc883411996-09-10 14:44:21 +0000638 char *q;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000639 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000640 /* Test for alternate separator */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000641 q = strrchr(p ? p : argv0, '/');
Guido van Rossumcc883411996-09-10 14:44:21 +0000642 if (q != NULL)
643 p = q;
644 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000645 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +0000646 if (n > 1 && p[-1] != ':')
647 n--; /* Drop trailing separator */
648 }
649 }
650#else /* All other filename syntaxes */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000651 if (argc > 0 && argv0 != NULL)
652 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000653 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000654 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +0000655#if SEP == '/' /* Special case for Unix filename syntax */
656 if (n > 1)
657 n--; /* Drop trailing separator */
658#endif /* Unix */
659 }
660#endif /* All others */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000661 a = PyString_FromStringAndSize(argv0, n);
Guido van Rossum94a96671996-07-30 20:35:50 +0000662 if (a == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000663 Py_FatalError("no mem for sys.path insertion");
664 if (PyList_Insert(path, 0, a) < 0)
665 Py_FatalError("sys.path.insert(0) failed");
666 Py_DECREF(a);
Guido van Rossuma63d9f41996-07-24 01:31:37 +0000667 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000668 Py_DECREF(av);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000669}
Guido van Rossuma890e681998-05-12 14:59:24 +0000670
671
672/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
673 Adapted from code submitted by Just van Rossum.
674
675 PySys_WriteStdout(format, ...)
676 PySys_WriteStderr(format, ...)
677
678 The first function writes to sys.stdout; the second to sys.stderr. When
679 there is a problem, they write to the real (C level) stdout or stderr;
Guido van Rossum8442af31998-10-12 18:22:10 +0000680 no exceptions are raised.
Guido van Rossuma890e681998-05-12 14:59:24 +0000681
682 Both take a printf-style format string as their first argument followed
683 by a variable length argument list determined by the format string.
684
685 *** WARNING ***
686
687 The format should limit the total size of the formatted output string to
688 1000 bytes. In particular, this means that no unrestricted "%s" formats
689 should occur; these should be limited using "%.<N>s where <N> is a
690 decimal number calculated so that <N> plus the maximum size of other
691 formatted text does not exceed 1000 bytes. Also watch out for "%f",
692 which can print hundreds of digits for very large numbers.
693
694 */
695
696static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000697mywrite(char *name, FILE *fp, const char *format, va_list va)
Guido van Rossuma890e681998-05-12 14:59:24 +0000698{
699 PyObject *file;
Guido van Rossum8442af31998-10-12 18:22:10 +0000700 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossuma890e681998-05-12 14:59:24 +0000701
Guido van Rossum8442af31998-10-12 18:22:10 +0000702 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossuma890e681998-05-12 14:59:24 +0000703 file = PySys_GetObject(name);
704 if (file == NULL || PyFile_AsFile(file) == fp)
705 vfprintf(fp, format, va);
706 else {
707 char buffer[1001];
Guido van Rossum8442af31998-10-12 18:22:10 +0000708 if (vsprintf(buffer, format, va) >= sizeof(buffer))
709 Py_FatalError("PySys_WriteStdout/err: buffer overrun");
Guido van Rossuma890e681998-05-12 14:59:24 +0000710 if (PyFile_WriteString(buffer, file) != 0) {
711 PyErr_Clear();
712 fputs(buffer, fp);
713 }
714 }
Guido van Rossum8442af31998-10-12 18:22:10 +0000715 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossuma890e681998-05-12 14:59:24 +0000716}
717
718void
Guido van Rossuma890e681998-05-12 14:59:24 +0000719PySys_WriteStdout(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +0000720{
721 va_list va;
722
Guido van Rossuma890e681998-05-12 14:59:24 +0000723 va_start(va, format);
Guido van Rossuma890e681998-05-12 14:59:24 +0000724 mywrite("stdout", stdout, format, va);
725 va_end(va);
726}
727
728void
Guido van Rossuma890e681998-05-12 14:59:24 +0000729PySys_WriteStderr(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +0000730{
731 va_list va;
732
Guido van Rossuma890e681998-05-12 14:59:24 +0000733 va_start(va, format);
Guido van Rossuma890e681998-05-12 14:59:24 +0000734 mywrite("stderr", stderr, format, va);
735 va_end(va);
736}