|
11 | 11 | # #
|
12 | 12 | #####################################################################
|
13 | 13 | import sys, os
|
| 14 | +from io import UnsupportedOperation |
14 | 15 | import logging, logging.handlers
|
| 16 | +import warnings |
15 | 17 | from labscript_utils.ls_zprocess import Handler, ensure_connected_to_zlog
|
16 | 18 |
|
17 | 19 |
|
@@ -52,21 +54,32 @@ def setup_logging(program_name, log_level=logging.DEBUG, terminal_level=logging.
|
52 | 54 | handler.setFormatter(formatter)
|
53 | 55 | handler.setLevel(log_level)
|
54 | 56 | 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 | + ) |
67 | 67 | 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') |
71 | 84 | logger.setLevel(logging.DEBUG)
|
72 | 85 | return logger
|
0 commit comments