emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: William Henney <whenney@gmail.com>
To: Eric Schulte <schulte.eric@gmail.com>
Cc: emacs-org <emacs-orgmode@gnu.org>
Subject: Re: [babel] Setting python interpreter version on per-block or per-subtree basis
Date: Fri, 25 Apr 2014 11:29:59 -0500	[thread overview]
Message-ID: <CAKchnZOjkRq3NUyQuEY2APAJgTuvwCGt--KBT0VtQkSV1FDraw@mail.gmail.com> (raw)
In-Reply-To: <87bnvp2zsp.fsf@gmail.com>


[-- Attachment #1.1: Type: text/plain, Size: 1846 bytes --]

Dear Sacha, Ian, and Eric

Thanks very much for your replies.  Sacha's way is a clever idea and works
fine, but I think Eric's patch is the best solution in the long term.
 Please see attached test file - the patch works perfectly.  Although I did
have to study the manual carefully to work out how get it to work using the
#+call: syntax. The key is to use "inside header arguments".  Ian's
solution with shebang works when tangling but not for direct evaluation of
the source block.

Cheers

Will




On Fri, Apr 25, 2014 at 10:27 AM, Eric Schulte <schulte.eric@gmail.com>wrote:

> The attached patch should allow the specification of the python command
> through a new :python header argument.  E.g.,
>
> #+begin_src python :python /path/to/python2
>   return 1 + 2
> #+end_src
>
> If someone who actually uses python could confirm that it works as
> expected then I'll be happy to apply it.
>
>
>
> Best,
> Eric
>
> William Henney <whenney@gmail.com> writes:
>
> > Hi
> >
> > Is there an easy way to specify the python version to use for a
> particular
> > block or sub-tree?
> >
> > My use case is that I have mainly migrated to python 3, but there is
> still
> > the occasional library that has not been updated yet, so I need to fall
> > back to python 2.7 for some tasks.
> >
> > I can work around the problem by putting the python 2 code in a separate
> > org file and use
> >
> > # Local Variables:
> > # org-babel-python-command: "/path/to/python2"
> > # End:
> >
> > but keeping everything in the same file would be preferable.
> >
> > Thanks
> >
> > Will
>
> --
> Eric Schulte
> https://cs.unm.edu/~eschulte
> PGP: 0x614CA05D
>
>


-- 

  Dr William Henney, Centro de Radioastronomía y Astrofísica,
  Universidad Nacional Autónoma de México, Campus Morelia

[-- Attachment #1.2: Type: text/html, Size: 2560 bytes --]

[-- Attachment #2: multi-python.org --]
[-- Type: application/octet-stream, Size: 3196 bytes --]

Test of Eric Schulte's patch to allow specifying the python interpreter via the =:python= header command. 

* Default python version
#+name: check-python-version
#+BEGIN_SRC python
import sys
return sys.version
#+END_SRC

#+RESULTS: check-python-version
: 3.3.5 |Anaconda 1.9.1 (x86_64)| (default, Mar 10 2014, 11:22:25) 
: [GCC 4.0.1 (Apple Inc. build 5493)]

This is the control experiment. 

* Custom python version
#+BEGIN_SRC python :python /Users/will/anaconda/envs/py27/bin/python
import sys
return sys.version
#+END_SRC

#+RESULTS:
: 2.7.5 |Anaconda 1.8.0 (x86_64)| (default, Oct 24 2013, 07:02:20) 
: [GCC 4.0.1 (Apple Inc. build 5493)]

This works.

* Test using call syntax
It is necessary to put the =:python= command in the /inside header arguments/, which go in square brackets before the function arguments. 

#+call: check-python-version[:python /Users/will/anaconda/envs/py27/bin/python]() 

#+RESULTS:
: 2.7.5 |Anaconda 1.8.0 (x86_64)| (default, Oct 24 2013, 07:02:20) 
: [GCC 4.0.1 (Apple Inc. build 5493)]

So that works fine, but beware that the following does not: 

#+call: check-python-version() :python /Users/will/anaconda/envs/py27/bin/python

#+RESULTS:
: 3.3.5 |Anaconda 1.9.1 (x86_64)| (default, Mar 10 2014, 11:22:25) 
: [GCC 4.0.1 (Apple Inc. build 5493)]


* Sacha Chua's alternative solution using a tag and advice

This lisp code must be evaluated first
#+begin_src emacs-lisp
(defadvice org-babel-execute:python (around will activate)
  (if (member "python2" (org-get-tags-at))
    (let ((org-babel-python-command "/Users/will/anaconda/envs/py27/bin/python"))
      ad-do-it)
    ad-do-it))
#+end_src

#+RESULTS:
: org-babel-execute:python

** Sacha direct test                                                :python2:
This works when the code block is directly evaluated
#+name: second-check-python-version
#+BEGIN_SRC python
import sys
return sys.version
#+END_SRC

#+RESULTS:
: 2.7.5 |Anaconda 1.8.0 (x86_64)| (default, Oct 24 2013, 07:02:20) 
: [GCC 4.0.1 (Apple Inc. build 5493)]

** Sacha call test one                                              :python2:
When calling another code block, what matters is that the tag is on the header where the block is defined, so this does not work
#+call: check-python-version()

#+RESULTS:
: 3.3.5 |Anaconda 1.9.1 (x86_64)| (default, Mar 10 2014, 11:22:25) 
: [GCC 4.0.1 (Apple Inc. build 5493)]


** Sacha call test two
But this does
#+call: second-check-python-version()

#+RESULTS:
: 2.7.5 |Anaconda 1.8.0 (x86_64)| (default, Oct 24 2013, 07:02:20) 
: [GCC 4.0.1 (Apple Inc. build 5493)]


* Ian Barton's alternative proposed solution with shebang
Does not work for direct evaluation with =C-c C-c=
#+begin_src python :shebang #!/Users/will/anaconda/envs/py27/bin/python :tangle py2-test.py :exports none :noweb yes :results output
import sys
print(sys.version)
#+end_src

#+RESULTS:
: 3.3.5 |Anaconda 1.9.1 (x86_64)| (default, Mar 10 2014, 11:22:25) 
: [GCC 4.0.1 (Apple Inc. build 5493)]

But does work with tangling to a file first
#+BEGIN_SRC sh :results verbatim
./py2-test.py
#+END_SRC

#+RESULTS:
: 2.7.5 |Anaconda 1.8.0 (x86_64)| (default, Oct 24 2013, 07:02:20) 
: [GCC 4.0.1 (Apple Inc. build 5493)]


  reply	other threads:[~2014-04-25 16:30 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-24 17:04 [babel] Setting python interpreter version on per-block or per-subtree basis William Henney
2014-04-25  1:59 ` Sacha Chua
2014-04-25  9:00 ` Ian Barton
2014-04-25 15:27 ` Eric Schulte
2014-04-25 16:29   ` William Henney [this message]
2014-04-25 18:04     ` Eric Schulte

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAKchnZOjkRq3NUyQuEY2APAJgTuvwCGt--KBT0VtQkSV1FDraw@mail.gmail.com \
    --to=whenney@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=schulte.eric@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).