Skip to content

Commit b8726ad

Browse files
authored
Merge pull request #78 from zakv/setup-logging-jupyter
Make setup_logging() more Jupyter-friendly.
2 parents d309a5f + c4dd2a8 commit b8726ad

File tree

1 file changed

+28
-15
lines changed

1 file changed

+28
-15
lines changed

labscript_utils/setup_logging.py

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
# #
1212
#####################################################################
1313
import sys, os
14+
from io import UnsupportedOperation
1415
import logging, logging.handlers
16+
import warnings
1517
from labscript_utils.ls_zprocess import Handler, ensure_connected_to_zlog
1618

1719

@@ -52,21 +54,32 @@ def setup_logging(program_name, log_level=logging.DEBUG, terminal_level=logging.
5254
handler.setFormatter(formatter)
5355
handler.setLevel(log_level)
5456
logger.addHandler(handler)
55-
if sys.stdout is not None and sys.stdout.fileno() >= 0:
56-
stdout_handler = logging.StreamHandler(sys.stdout)
57-
stdout_handler.setFormatter(formatter)
58-
stdout_handler.setLevel(terminal_level)
59-
logger.addHandler(stdout_handler)
60-
if sys.stderr is not None and sys.stderr.fileno() >= 0:
61-
# Send warnings and greater to stderr instead of stdout:
62-
stdout_handler.addFilter(LessThanFilter(logging.WARNING))
63-
sterr_handler = logging.StreamHandler(sys.stderr)
64-
sterr_handler.setFormatter(formatter)
65-
sterr_handler.setLevel(logging.WARNING)
66-
logger.addHandler(sterr_handler)
57+
try:
58+
# Check that sys.stdout.fileno is callable, which is needed below. It is NOT
59+
# callable in Jupyter notebooks.
60+
stdout_fileno = sys.stdout.fileno()
61+
except UnsupportedOperation:
62+
# In this case the code is likely being run from a Jupyter notebook, warn the
63+
# user that log messages won't be printed to stdout or stderr.
64+
warnings.warn(
65+
"Logging to stdout and stderr is disabled. See the log files for log messages."
66+
)
6767
else:
68-
# Prevent bug on windows where writing to stdout without a command
69-
# window causes a crash:
70-
sys.stdout = sys.stderr = open(os.devnull, 'w')
68+
if sys.stdout is not None and stdout_fileno >= 0:
69+
stdout_handler = logging.StreamHandler(sys.stdout)
70+
stdout_handler.setFormatter(formatter)
71+
stdout_handler.setLevel(terminal_level)
72+
logger.addHandler(stdout_handler)
73+
if sys.stderr is not None and sys.stderr.fileno() >= 0:
74+
# Send warnings and greater to stderr instead of stdout:
75+
stdout_handler.addFilter(LessThanFilter(logging.WARNING))
76+
sterr_handler = logging.StreamHandler(sys.stderr)
77+
sterr_handler.setFormatter(formatter)
78+
sterr_handler.setLevel(logging.WARNING)
79+
logger.addHandler(sterr_handler)
80+
else:
81+
# Prevent bug on windows where writing to stdout without a command
82+
# window causes a crash:
83+
sys.stdout = sys.stderr = open(os.devnull, 'w')
7184
logger.setLevel(logging.DEBUG)
7285
return logger

0 commit comments

Comments
 (0)