[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] emacs-24 01/01: Set PYTHONUNBUFFERED on shell startup.
From: |
Fabián Ezequiel Gallina |
Subject: |
[Emacs-diffs] emacs-24 01/01: Set PYTHONUNBUFFERED on shell startup. |
Date: |
Sat, 22 Nov 2014 23:09:42 +0000 |
branch: emacs-24
commit 238c052fdb9da3b1f96c09809461b70813c5bebc
Author: Fabián Ezequiel Gallina <address@hidden>
Date: Sat Nov 22 20:09:30 2014 -0300
Set PYTHONUNBUFFERED on shell startup.
Fixes: debbugs:18595
* lisp/progmodes/python.el (python-shell-unbuffered): New var.
(python-shell-calculate-process-environment): Use it.
* test/automated/python-tests.el
(python-shell-calculate-process-environment-4)
(python-shell-calculate-process-environment-5): New tests.
(python-shell-make-comint-3): Use file-equal-p.
(python-shell-get-or-create-process-1)
(python-shell-get-or-create-process-2)
(python-shell-get-or-create-process-3): Fix interpreter for
Windows.
---
lisp/ChangeLog | 7 +++
lisp/progmodes/python.el | 22 +++++++---
test/ChangeLog | 11 +++++
test/automated/python-tests.el | 89 +++++++++++++++++++++++----------------
4 files changed, 86 insertions(+), 43 deletions(-)
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 0f16eab..e59c391 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,10 @@
+2014-11-22 Fabián Ezequiel Gallina <address@hidden>
+
+ Set PYTHONUNBUFFERED on shell startup.
+
+ * progmodes/python.el (python-shell-unbuffered): New var.
+ (python-shell-calculate-process-environment): Use it.
+
2014-11-22 Michael Albinus <address@hidden>
* net/tramp.el (tramp-action-password): Clean password on subsequent
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 5a5a039..4c27136 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -94,13 +94,13 @@
;; 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
@@ -1813,6 +1813,14 @@ Restart the Python shell after changing this variable
for it to take effect."
: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'
@@ -2087,6 +2095,8 @@ uniqueness for different types of configurations."
(virtualenv (if python-shell-virtualenv-path
(directory-file-name python-shell-virtualenv-path)
nil)))
+ (when python-shell-unbuffered
+ (setenv "PYTHONUNBUFFERED" "1"))
(when python-shell-extra-pythonpaths
(setenv "PYTHONPATH"
(format "%s%s%s"
diff --git a/test/ChangeLog b/test/ChangeLog
index 4f7f068..0da5f99 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,14 @@
+2014-11-22 Fabián Ezequiel Gallina <address@hidden>
+
+ * automated/python-tests.el
+ (python-shell-calculate-process-environment-4)
+ (python-shell-calculate-process-environment-5): New tests.
+ (python-shell-make-comint-3): Use file-equal-p.
+ (python-shell-get-or-create-process-1)
+ (python-shell-get-or-create-process-2)
+ (python-shell-get-or-create-process-3): Fix interpreter for
+ Windows (Bug#18595).
+
2014-11-15 Fabián Ezequiel Gallina <address@hidden>
* automated/python-tests.el (python-indent-dedenters-8): New test
diff --git a/test/automated/python-tests.el b/test/automated/python-tests.el
index f368f99..f84ded8 100644
--- a/test/automated/python-tests.el
+++ b/test/automated/python-tests.el
@@ -1872,6 +1872,23 @@ Using `python-shell-interpreter' and
python-shell-virtualenv-path
path-separator original-path)))))
+(ert-deftest python-shell-calculate-process-environment-4 ()
+ "Test `python-shell-unbuffered' modification."
+ (setenv "PYTHONUNBUFFERED")
+ (let* ((process-environment
+ (python-shell-calculate-process-environment)))
+ ;; Defaults to t
+ (should python-shell-unbuffered)
+ (should (string= (getenv "PYTHONUNBUFFERED") "1"))))
+
+(ert-deftest python-shell-calculate-process-environment-5 ()
+ (setenv "PYTHONUNBUFFERED")
+ "Test `python-shell-unbuffered' modification."
+ (let* ((python-shell-unbuffered nil)
+ (process-environment
+ (python-shell-calculate-process-environment)))
+ (should (not (getenv "PYTHONUNBUFFERED")))))
+
(ert-deftest python-shell-calculate-exec-path-1 ()
"Test `python-shell-exec-path' modification."
(let* ((original-exec-path exec-path)
@@ -1961,8 +1978,9 @@ and `python-shell-interpreter-args' in the new shell
buffer."
(should (process-live-p process))
(with-current-buffer shell-buffer
(should (eq major-mode 'inferior-python-mode))
- (should (string= python-shell-interpreter
- (executable-find python-tests-shell-interpreter)))
+ (should (file-equal-p
+ python-shell-interpreter
+ (executable-find python-tests-shell-interpreter)))
(should (string= python-shell-interpreter-args "-i"))))
(kill-buffer shell-buffer))))
@@ -2050,12 +2068,11 @@ and `python-shell-interpreter-args' in the new shell
buffer."
(skip-unless (executable-find python-tests-shell-interpreter))
(python-tests-with-temp-file
""
- (let* ((python-shell-interpreter
- (executable-find python-tests-shell-interpreter))
+ (let* ((cmd
+ (concat (executable-find python-tests-shell-interpreter) " -i"))
(use-dialog-box)
(dedicated-process-name (python-shell-get-process-name t))
- (dedicated-process
- (python-shell-get-or-create-process python-shell-interpreter t))
+ (dedicated-process (python-shell-get-or-create-process cmd t))
(dedicated-shell-buffer (process-buffer dedicated-process)))
(unwind-protect
(progn
@@ -2073,12 +2090,11 @@ and `python-shell-interpreter-args' in the new shell
buffer."
(skip-unless (executable-find python-tests-shell-interpreter))
(python-tests-with-temp-file
""
- (let* ((python-shell-interpreter
- (executable-find python-tests-shell-interpreter))
+ (let* ((cmd
+ (concat (executable-find python-tests-shell-interpreter) " -i"))
(use-dialog-box)
(process-name (python-shell-get-process-name nil))
- (process
- (python-shell-get-or-create-process python-shell-interpreter))
+ (process (python-shell-get-or-create-process cmd))
(shell-buffer (process-buffer process)))
(unwind-protect
(progn
@@ -2088,43 +2104,42 @@ and `python-shell-interpreter-args' in the new shell
buffer."
(kill-buffer shell-buffer)
;; Check there are no processes for current buffer.
(should (not (python-shell-get-process))))
- (ignore-errors (kill-buffer dedicated-shell-buffer))))))
+ (ignore-errors (kill-buffer shell-buffer))))))
(ert-deftest python-shell-get-or-create-process-3 ()
"Check shell dedicated/global process preference."
(skip-unless (executable-find python-tests-shell-interpreter))
(python-tests-with-temp-file
""
- (let* ((python-shell-interpreter
- (executable-find python-tests-shell-interpreter))
+ (let* ((cmd
+ (concat (executable-find python-tests-shell-interpreter) " -i"))
+ (python-shell-interpreter python-tests-shell-interpreter)
(use-dialog-box)
(dedicated-process-name (python-shell-get-process-name t))
(global-process)
(dedicated-process))
- (unwind-protect
- (progn
- ;; Create global process
- (run-python python-shell-interpreter nil)
- (setq global-process (get-buffer-process "*Python*"))
- (should global-process)
- (set-process-query-on-exit-flag global-process nil)
- ;; Create dedicated process
- (run-python python-shell-interpreter t)
- (setq dedicated-process (get-process dedicated-process-name))
- (should dedicated-process)
- (set-process-query-on-exit-flag dedicated-process nil)
- ;; Prefer dedicated.
- (should (equal (python-shell-get-or-create-process)
- dedicated-process))
- ;; Kill the dedicated so the global takes over.
- (kill-buffer (process-buffer dedicated-process))
- ;; Detect global.
- (should (equal (python-shell-get-or-create-process) global-process))
- ;; Kill the global.
- (kill-buffer (process-buffer global-process))
- ;; Check there are no processes for current buffer.
- (should (not (python-shell-get-process))))
- (ignore-errors (kill-buffer dedicated-shell-buffer))))))
+ (progn
+ ;; Create global process
+ (run-python cmd nil)
+ (setq global-process (get-buffer-process "*Python*"))
+ (should global-process)
+ (set-process-query-on-exit-flag global-process nil)
+ ;; Create dedicated process
+ (run-python cmd t)
+ (setq dedicated-process (get-process dedicated-process-name))
+ (should dedicated-process)
+ (set-process-query-on-exit-flag dedicated-process nil)
+ ;; Prefer dedicated.
+ (should (equal (python-shell-get-or-create-process)
+ dedicated-process))
+ ;; Kill the dedicated so the global takes over.
+ (kill-buffer (process-buffer dedicated-process))
+ ;; Detect global.
+ (should (equal (python-shell-get-or-create-process) global-process))
+ ;; Kill the global.
+ (kill-buffer (process-buffer global-process))
+ ;; Check there are no processes for current buffer.
+ (should (not (python-shell-get-process)))))))
(ert-deftest python-shell-internal-get-or-create-process-1 ()
"Check internal shell process creation fallback."
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] emacs-24 01/01: Set PYTHONUNBUFFERED on shell startup.,
Fabián Ezequiel Gallina <=