Return true (nonzero) if the standard I/O file *fp* with name *filename* is
deemed interactive. This is the case for files for which ``isatty(fileno(fp))``
- is true. If the global flag :c:data:`Py_InteractiveFlag` is true, this function
+ is true. If the :c:member:`PyConfig.interactive` is non-zero, this function
also returns true if the *filename* pointer is ``NULL`` or if the name is equal to
one of the strings ``'<stdin>'`` or ``'???'``.
+ This function must not be called before Python is initialized.
+
.. c:function:: void PyOS_BeforeFork()
'import _testcapi;'
'_testcapi.crash_no_current_thread()'],
stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
+ stderr=subprocess.PIPE,
+ text=True)
(out, err) = p.communicate()
- self.assertEqual(out, b'')
+ self.assertEqual(out, '')
# This used to cause an infinite loop.
- self.assertTrue(err.rstrip().startswith(
- b'Fatal Python error: '
- b'PyThreadState_Get: '
- b'the function must be called with the GIL held, '
- b'but the GIL is released '
- b'(the current Python thread state is NULL)'),
+ msg = ("Fatal Python error: PyThreadState_Get: "
+ "the function must be called with the GIL held, "
+ "after Python initialization and before Python finalization, "
+ "but the GIL is released "
+ "(the current Python thread state is NULL)")
+ self.assertTrue(err.rstrip().startswith(msg),
err)
def test_memoryview_from_NULL_pointer(self):
_Py_FatalError_TstateNULL(const char *func)
{
_Py_FatalErrorFunc(func,
- "the function must be called with the GIL held, "
- "but the GIL is released "
- "(the current Python thread state is NULL)");
+ "the function must be called with the GIL held, "
+ "after Python initialization and before Python finalization, "
+ "but the GIL is released (the current Python thread state is NULL)");
}
int
int Py_DebugFlag = 0; /* Needed by parser.c */
int Py_VerboseFlag = 0; /* Needed by import.c */
int Py_QuietFlag = 0; /* Needed by sysmodule.c */
-int Py_InteractiveFlag = 0; /* Needed by Py_FdIsInteractive() below */
+int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */
int Py_InspectFlag = 0; /* Needed to determine whether to exit at SystemExit */
int Py_OptimizeFlag = 0; /* Needed by compile.c */
int Py_NoSiteFlag = 0; /* Suppress 'import site' */
int
Py_FdIsInteractive(FILE *fp, const char *filename)
{
- if (isatty((int)fileno(fp)))
+ if (isatty(fileno(fp))) {
return 1;
- if (!Py_InteractiveFlag)
+ }
+ if (!_Py_GetConfig()->interactive) {
return 0;
- return (filename == NULL) ||
- (strcmp(filename, "<stdin>") == 0) ||
- (strcmp(filename, "???") == 0);
+ }
+ return ((filename == NULL)
+ || (strcmp(filename, "<stdin>") == 0)
+ || (strcmp(filename, "???") == 0));
}
int
_Py_FdIsInteractive(FILE *fp, PyObject *filename)
{
- if (isatty((int)fileno(fp))) {
+ if (isatty(fileno(fp))) {
return 1;
}
- if (!Py_InteractiveFlag) {
+ if (!_Py_GetConfig()->interactive) {
return 0;
}
- return (filename == NULL) ||
- (PyUnicode_CompareWithASCIIString(filename, "<stdin>") == 0) ||
- (PyUnicode_CompareWithASCIIString(filename, "???") == 0);
+ return ((filename == NULL)
+ || (PyUnicode_CompareWithASCIIString(filename, "<stdin>") == 0)
+ || (PyUnicode_CompareWithASCIIString(filename, "???") == 0));
}
{
assert(PyGILState_Check());
PyThreadState *tstate = _PyThreadState_GET();
+ _Py_EnsureTstateNotNULL(tstate);
return _PyInterpreterState_GetConfig(tstate->interp);
}