summaryrefslogtreecommitdiffstats
path: root/Python/pythonrun.c
diff options
context:
space:
mode:
authorChristian Heimes <christian@cheimes.de>2007-11-13 02:19:40 (GMT)
committerChristian Heimes <christian@cheimes.de>2007-11-13 02:19:40 (GMT)
commit58cb1b8b0ef200b7f7d4aba82642a63ce7532545 (patch)
tree629216d60c66aaf168ee0f4903824213fcf4637f /Python/pythonrun.c
parentf05149a257560144cbaaea3e96c404803dbf26e4 (diff)
downloadcpython-58cb1b8b0ef200b7f7d4aba82642a63ce7532545.zip
cpython-58cb1b8b0ef200b7f7d4aba82642a63ce7532545.tar.gz
cpython-58cb1b8b0ef200b7f7d4aba82642a63ce7532545.tar.bz2
Fix for #1415 pythonw.exe fails because std streams a missing
After a long discussion about the problem with Windows GUI apps Guido decided that sys.stdin, stdout and stderr should be None when the C runtime library returns invalid file descriptors for the standard streams. So far the only known cases are Windows GUI apps and scripts started with pythonw on Windows. The OS restrictions are tight enough to catch the problem on other OSes.
Diffstat (limited to 'Python/pythonrun.c')
-rw-r--r--Python/pythonrun.c61
1 files changed, 49 insertions, 12 deletions
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 0b3935a..82f8e37 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -717,7 +717,7 @@ initstdio(void)
PyObject *bimod = NULL;
PyObject *m;
PyObject *std = NULL;
- int status = 0;
+ int status = 0, fd;
/* Hack to avoid a nasty recursion issue when Python is invoked
in verbose mode: pre-import the Latin-1 and UTF-8 codecs */
@@ -748,35 +748,72 @@ initstdio(void)
}
/* Set sys.stdin */
- if (!(std = PyFile_FromFd(fileno(stdin), "<stdin>", "r", -1,
- NULL, "\n", 0))) {
+ fd = fileno(stdin);
+ /* Under some conditions stdin, stdout and stderr may not be connected
+ * and fileno() may point to an invalid file descriptor. For example
+ * GUI apps don't have valid standard streams by default.
+ */
+ if (fd < 0) {
+#ifdef MS_WINDOWS
+ std = Py_None;
+ Py_INCREF(std);
+#else
goto error;
+#endif
}
+ else {
+ if (!(std = PyFile_FromFd(fd, "<stdin>", "r", -1, NULL,
+ "\n", 0))) {
+ goto error;
+ }
+ } /* if (fd < 0) */
PySys_SetObject("__stdin__", std);
PySys_SetObject("stdin", std);
Py_DECREF(std);
/* Set sys.stdout */
- if (!(std = PyFile_FromFd(fileno(stdout), "<stdout>", "w", -1,
- NULL, "\n", 0))) {
- goto error;
- }
+ fd = fileno(stdout);
+ if (fd < 0) {
+#ifdef MS_WINDOWS
+ std = Py_None;
+ Py_INCREF(std);
+#else
+ goto error;
+#endif
+ }
+ else {
+ if (!(std = PyFile_FromFd(fd, "<stdout>", "w", -1, NULL,
+ "\n", 0))) {
+ goto error;
+ }
+ } /* if (fd < 0) */
PySys_SetObject("__stdout__", std);
PySys_SetObject("stdout", std);
Py_DECREF(std);
#if 1 /* Disable this if you have trouble debugging bootstrap stuff */
/* Set sys.stderr, replaces the preliminary stderr */
- if (!(std = PyFile_FromFd(fileno(stderr), "<stderr>", "w", -1,
- NULL, "\n", 0))) {
- goto error;
- }
+ fd = fileno(stderr);
+ if (fd < 0) {
+#ifdef MS_WINDOWS
+ std = Py_None;
+ Py_INCREF(std);
+#else
+ goto error;
+#endif
+ }
+ else {
+ if (!(std = PyFile_FromFd(fd, "<stderr>", "w", -1, NULL,
+ "\n", 0))) {
+ goto error;
+ }
+ } /* if (fd < 0) */
PySys_SetObject("__stderr__", std);
PySys_SetObject("stderr", std);
Py_DECREF(std);
#endif
- if (0) {
+ if (0) {
error:
status = -1;
}