* Re: [Emacs-diffs] trunk r117592: Grab all Python process output before inferior-python-mode hooks. [not found] <E1XBayX-0002IL-CG@vcs.savannah.gnu.org> @ 2014-07-28 8:18 ` Stefan Monnier 2014-07-28 21:12 ` Fabián Ezequiel Gallina 0 siblings, 1 reply; 5+ messages in thread From: Stefan Monnier @ 2014-07-28 8:18 UTC (permalink / raw) To: Fabián Ezequiel Gallina; +Cc: emacs-devel > + ;; Ensure all the output is accepted before running any hooks. > + (accept-process-output (get-buffer-process (current-buffer))) > + (sit-for 0.1 t)) Why do you need sit-for here? Stefan ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Emacs-diffs] trunk r117592: Grab all Python process output before inferior-python-mode hooks. 2014-07-28 8:18 ` [Emacs-diffs] trunk r117592: Grab all Python process output before inferior-python-mode hooks Stefan Monnier @ 2014-07-28 21:12 ` Fabián Ezequiel Gallina 2014-07-28 23:21 ` Stefan Monnier 0 siblings, 1 reply; 5+ messages in thread From: Fabián Ezequiel Gallina @ 2014-07-28 21:12 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: >> + ;; Ensure all the output is accepted before running any hooks. >> + (accept-process-output (get-buffer-process (current-buffer))) >> + (sit-for 0.1 t)) > > Why do you need sit-for here? > I just added a comment about it in revno 117605. ;; At this point, all process output should have been received, but ;; on GNU/Linux, calling `python-shell-internal-send-string' without ;; a running internal shell fails to grab output properly unless ;; this `sit-for' is in place. Sorry about that, I should have placed that comment before! Cheers, Fabián ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Emacs-diffs] trunk r117592: Grab all Python process output before inferior-python-mode hooks. 2014-07-28 21:12 ` Fabián Ezequiel Gallina @ 2014-07-28 23:21 ` Stefan Monnier 2014-07-31 2:30 ` Fabián Ezequiel Gallina 0 siblings, 1 reply; 5+ messages in thread From: Stefan Monnier @ 2014-07-28 23:21 UTC (permalink / raw) To: Fabián Ezequiel Gallina; +Cc: emacs-devel >>> + ;; Ensure all the output is accepted before running any hooks. >>> + (accept-process-output (get-buffer-process (current-buffer))) >>> + (sit-for 0.1 t)) >> Why do you need sit-for here? > I just added a comment about it in revno 117605. > ;; At this point, all process output should have been received, but > ;; on GNU/Linux, calling `python-shell-internal-send-string' without > ;; a running internal shell fails to grab output properly unless > ;; this `sit-for' is in place. > Sorry about that, I should have placed that comment before! Sounds like a workaround for a problem somewhere in Emacs. Could you make a bug-report for it, ideally providing a simple test case? Stefan ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Emacs-diffs] trunk r117592: Grab all Python process output before inferior-python-mode hooks. 2014-07-28 23:21 ` Stefan Monnier @ 2014-07-31 2:30 ` Fabián Ezequiel Gallina 2014-07-31 6:54 ` Stefan Monnier 0 siblings, 1 reply; 5+ messages in thread From: Fabián Ezequiel Gallina @ 2014-07-31 2:30 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: >>>> + ;; Ensure all the output is accepted before running any hooks. >>>> + (accept-process-output (get-buffer-process (current-buffer))) >>>> + (sit-for 0.1 t)) >>> Why do you need sit-for here? >> I just added a comment about it in revno 117605. >> ;; At this point, all process output should have been received, but >> ;; on GNU/Linux, calling `python-shell-internal-send-string' without >> ;; a running internal shell fails to grab output properly unless >> ;; this `sit-for' is in place. >> Sorry about that, I should have placed that comment before! > > Sounds like a workaround for a problem somewhere in Emacs. > Could you make a bug-report for it, ideally providing a simple > test case? So I think I finally understand what's going on: When Python starts up, it actually sends two things to stdout in separate calls. The first one is the banner and the second is the initial prompt. What it seems to be happening is that on the first accept-process-output call, the output that is grabbed is just the banner, leaving the prompt outside, and that's what the sit-for was actually "fixing". The truth is (I think) that sit-for should be another accept-process-output call. To exercise this, I wrote the following example. (let ((buffer (get-buffer-create "*accept-bug*"))) (with-current-buffer "*accept-bug*" (start-process "python" (current-buffer) "python" "-i") (let ((process (get-buffer-process (current-buffer)))) (set-process-query-on-exit-flag process nil) (message "Output (0)\n====================\n%s\n\n" (buffer-substring-no-properties (point-min) (point-max))) (accept-process-output process) ; (a) (message "Output (1)\n====================\n%s\n\n" (buffer-substring-no-properties (point-min) (point-max))) (accept-process-output process) ; (b) (message "Output (2)\n====================\n%s\n\n" (buffer-substring-no-properties (point-min) (point-max))) (process-send-string process (format "print ('a' * 16)\n")) (accept-process-output process) ; (c) (prog1 (let ((output (buffer-substring-no-properties (point-min) (point-max)))) (format "Output (3)\n====================\n%s\n\n" output)) (kill-buffer (current-buffer)))))) Evaluating that should let you see in the *Messages* buffer the behavior I'm describing. Commenting any of the accept-process-output calls, ends up returning just the banner and the prompt sans the output from the print statement. My guess then is that this is not really an Emacs bug but rather a singularity of how the Python process sends its output, but since I'm no expert to tell if accept-process-output should be smart enough to handle that case, I would let you to decide. Saludos, Fabián ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Emacs-diffs] trunk r117592: Grab all Python process output before inferior-python-mode hooks. 2014-07-31 2:30 ` Fabián Ezequiel Gallina @ 2014-07-31 6:54 ` Stefan Monnier 0 siblings, 0 replies; 5+ messages in thread From: Stefan Monnier @ 2014-07-31 6:54 UTC (permalink / raw) To: Fabián Ezequiel Gallina; +Cc: emacs-devel > What it seems to be happening is that on the first accept-process-output > call, the output that is grabbed is just the banner, leaving the prompt > outside, and that's what the sit-for was actually "fixing". The truth > is (I think) that sit-for should be another accept-process-output call. Actually, there's no guarantee that the two chunks that are sent by Python will be received as 2 chunks by Emacs. It all depends on the OS and timing and buffering. It could be received as a single chunk (typically if Emacs gets to run "late" enough that both chunks have already been sent), or it could be further divided by the OS into smaller chunks (typically if the chunks are large). So you should use a loop, which checks the actual text received, looking for a tell-tale sign (e.g. a prompt) that "we've received all we need so far". Stefan ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-07-31 6:54 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <E1XBayX-0002IL-CG@vcs.savannah.gnu.org> 2014-07-28 8:18 ` [Emacs-diffs] trunk r117592: Grab all Python process output before inferior-python-mode hooks Stefan Monnier 2014-07-28 21:12 ` Fabián Ezequiel Gallina 2014-07-28 23:21 ` Stefan Monnier 2014-07-31 2:30 ` Fabián Ezequiel Gallina 2014-07-31 6:54 ` Stefan Monnier
Code repositories for project(s) associated with this external index https://git.savannah.gnu.org/cgit/emacs.git https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.