;; python-shell-interpreter-args
;; "-i C:\\Python27\\Scripts\\ipython-script.py")
-;; If you are experiencing missing or delayed output in your shells,
-;; that's likely caused by your Operating System's pipe buffering
-;; (e.g. this is known to happen running CPython 3.3.4 in Windows 7.
+;; Missing or delayed output used to happen due to differences between
+;; Operating Systems' pipe buffering (e.g. CPython 3.3.4 in Windows 7.
;; See URL `http://debbugs.gnu.org/cgi/bugreport.cgi?bug=17304'). To
-;; fix this, using CPython's "-u" commandline argument or setting the
-;; "PYTHONUNBUFFERED" environment variable should help: See URL
-;; `https://docs.python.org/3/using/cmdline.html#cmdoption-u'.
+;; avoid this, the `python-shell-unbuffered' defaults to non-nil and
+;; controls whether `python-shell-calculate-process-environment'
+;; should set the "PYTHONUNBUFFERED" environment variable on startup:
+;; See URL `https://docs.python.org/3/using/cmdline.html#cmdoption-u'.
;; The interaction relies upon having prompts for input (e.g. ">>> "
;; and "... " in standard Python shell) and output (e.g. "Out[1]: " in
:group 'python
:safe 'booleanp)
+(defcustom python-shell-unbuffered t
+ "Should shell output be unbuffered?.
+When non-nil, this may prevent delayed and missing output in the
+Python shell. See commentary for details."
+ :type 'boolean
+ :group 'python
+ :safe 'booleanp)
+
(defcustom python-shell-process-environment nil
"List of environment variables for Python shell.
This variable follows the same rules as `process-environment'
(virtualenv (if python-shell-virtualenv-root
(directory-file-name python-shell-virtualenv-root)
nil)))
+ (when python-shell-unbuffered
+ (setenv "PYTHONUNBUFFERED" "1"))
(when python-shell-extra-pythonpaths
(setenv "PYTHONPATH" (python-shell-calculate-pythonpath)))
(if (not virtualenv)
(defcustom python-shell-completion-setup-code
"try:
- import readline, rlcompleter
+ import __builtin__
except ImportError:
+ # Python 3
+ import builtins as __builtin__
+try:
+ import readline, rlcompleter
+except:
def __PYTHON_EL_get_completions(text):
return []
else:
def __PYTHON_EL_get_completions(text):
+ builtins = dir(__builtin__)
completions = []
try:
splits = text.split()
is_module = splits and splits[0] in ('from', 'import')
- is_ipython = getattr(
- __builtins__, '__IPYTHON__',
- getattr(__builtins__, '__IPYTHON__active', False))
+ is_ipython = ('__IPYTHON__' in builtins or
+ '__IPYTHON__active' in builtins)
if is_module:
from IPython.core.completerlib import module_completion
completions = module_completion(text.strip())
- elif is_ipython and getattr(__builtins__, '__IP', None):
+ elif is_ipython and '__IP' in builtins:
completions = __IP.complete(text)
- elif is_ipython and getattr(__builtins__, 'get_ipython', None):
+ elif is_ipython and 'get_ipython' in builtins:
completions = get_ipython().Completer.all_completions(text)
else:
i = 0