PATH in OS X Jupyter notebook

103 views
Skip to first unread message

John H Palmieri

unread,
Jun 22, 2022, 12:37:11 PM6/22/22
to sage-support
How do I set the PATH in the OS X Jupyter notebook, if I'm using the 3-manifolds binary app? I mean, I know how to do it in an individual notebook, but how do I set the default PATH for every notebook? For example, how do I add /usr/local/bin so that it's in the PATH every time I open a new notebook?


--
John

slelievre

unread,
Jun 24, 2022, 1:09:39 PM6/24/22
to sage-support
2022-06-22 16:37:11 UTC, John H Palmieri:

>
> How do I set the PATH in the OS X Jupyter notebook,
> if I'm using the 3-manifolds binary app? I mean, I know
> how to do it in an individual notebook, but how do I set
> the default PATH for every notebook? For example,
> how do I add /usr/local/bin so that it's in the PATH
> every time I open a new notebook?

Hi John,

Good job with your comments at

- Ask Sage question 62873
  https://ask.sagemath.org/question/62873
  Animating plots in Jupyter/Sagemath

Here is a possibility for the missing bit, after reading

- discussion at [Stack Overflow question 34976803](https://stackoverflow.com/q/34976803)
- [Lucy Park: When Python imports but IPython does not](https://www.lucypark.kr/blog/2013/02/10/when-python-imports-and-ipython-does-not/)

To define some code to be run at the start of each
Sage session, and/or each time the Sage Jupyter
kernel starts, edit one or both of the files

- `$HOME/.sage/ipython-5.0.0/profile_default/ipython_config.py`
- `$HOME/.sage/ipython-5.0.0/profile_default/ipython_kernel_config.py`

in which you should find a section like this:

    ## lines of code to run at IPython startup.
    #  Default: []
    # c.InteractiveShellApp.exec_lines = []

Uncomment the last line in that section and add
any code to run. For example:

    ## lines of code to run at IPython startup.
    #  Default: []
    c.InteractiveShellApp.exec_lines = [
        import sys; sys.path.append('/usr/local/bin')
    ]
 
Feel free to consolidate your comments and this idea
into an answer to the Ask Sage question.   --Samuel

John H Palmieri

unread,
Jun 24, 2022, 3:08:17 PM6/24/22
to sage-support
Hi Samuel,

Thank you for this. One thing: I made a mistake in my comments on ask.sagemath.org. Changing sys.path changes the Python path, not the path for executables. One option is to use

    import os; os.environ["PATH"] += ":/usr/local/bin"

Any better ways to do this? Your pointer on how to include this into IPython config files works, as long as the lines are in quotes:

c.InteractiveShellApp.exec_lines = [
    'import os; os.environ["PATH"] += ":/usr/local/bin" ']


Marc Culler

unread,
Jun 24, 2022, 6:12:52 PM6/24/22
to sage-support
Thank you for figuring that out Samuel.  Now here is a question for both of you.  The macOS app intentionally sets a minimal environment when it starts sage.  It is intentionally minimal because it would be dangerous, in terms of security, but more importantly in terms of the potential for creating hard-to-debug crashes of the app, to simply accept whatever weird stuff the user happens to have in their environment.  The decision to set a specific minimal environment for the app was made after such a crash, which was related to traces of an obsolete Sage installation left in a user's .bashrc file.

But dangerous should not necessarily mean impossible.  It would be feasible to add a preferences panel to the app which could include a PATH string to be appended to the minimal default PATH at startup.  Being forced to type that string into a preferences dialog would at least alert the user to the possibility that the next weird crash might be their own fault.  But Samuel's answer indicates that expert users can actually do this using a completely orthogonal preferences setting (one of millions, I suspect) namely editing an IPython config file hidden in the user's .sage directory.  His answer shows that it is not impossible, just difficult.

My question is whether Samuel's approach is better than providing a simple way to modify the PATH, and thereby inviing an unsophisticated user to make a big mess which could cripple the app.  The esoteric knowledge needed to find and edit that config file provides a pretty good filter for ensuring that people who do this know what they are doing, or at least know that they are responsible for the consequences of making a mistake while doing it.  Also, it is unclear to me how many users would actually want to use such a feature.  Adding features that almost no one needs is not my idea of a good design approach.

What do the two of you think?

- Marc

John H Palmieri

unread,
Jun 24, 2022, 11:01:20 PM6/24/22
to sage-support
Hi Marc,

Very good question. I think that allowing users to modify the standard config files is the right thing to do, but I'm really not sure. I worry that the next person will want to modify a different setting, and you don't want to get dragged into recreating IPython/Jupyter preferences. For debugging, would it be worth providing a warning if a config file is found, or if a config file is found with any nonstandard settings? (The default config file is entirely commented out.)

By the way, I debugged Samuel's suggestion by running "./sage -n" with a local installation: it printed error messages in the terminal where I ran it that let me know that something was wrong. I figured out that I had to use quotes, as in

  c.InteractiveShellApp.exec_lines = ['import sys; ...']

rather than

  c.InteractiveShellApp.exec_lines = [import sys; ...]

I don't know where to view the corresponding error messages for the OS X app.

A question for both of you: I think the standard situation is to not have a profile directory, you have to run "sage --ipython profile create". Is there a good way to do this instead from a Jupyter notebook? Then someone could create a profile directory without having to use the terminal, although they would need to use a text editor to modify it.

--
John

Marc Culler

unread,
Jun 24, 2022, 11:28:29 PM6/24/22
to sage-s...@googlegroups.com
Hi John,

A macOS app launched from an icon has no stdout or stderr.  Apple's NSLog command will write to stderr if it exists, and to a log file if it does not exist.  But simply writing to stderr as most unix programs do has no effect if stderr does not exist.  When using the terminal as the input for the sage app any stderr output generated by sage will go to the terminal.  But there is no place for such error messages to go if they are generated before sage is launched.  The /usr/local/bin/sage command is available as long as you install the recommended extra package, and anyone who is debugging should use it whenever necessary, as you did.

I don't see any value in working hard to try to arrange that every possible thing can be done without ever using a terminal.  There is nothing wrong with using a terminal.  There are many tasks for which a terminal is the optimal tool.  So be it.

- Marc

--
You received this message because you are subscribed to a topic in the Google Groups "sage-support" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/sage-support/NiCkmMCEfd4/unsubscribe.
To unsubscribe from this group and all its topics, send an email to sage-support...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/sage-support/cca085d1-7134-4297-b666-1877f86aec84n%40googlegroups.com.

Marc Culler

unread,
Jun 24, 2022, 11:38:22 PM6/24/22
to sage-s...@googlegroups.com
I should have mentioned that it is always possible to run the main executable of a macOS app from the command line.  E.g.

$ /Applications/SageMath.app/Contents/MacOS/SageMath

When you do that, the process  that is launched is almost identical to the one that is launched when you click on the icon, the difference being that it does have a stdout and stderr.  So if you launch the app that way from your terminal then you will be able to see any messages that are being written to stderr.  (This is one of those situations for which a terminal is an optimal tool.)

- Marc


John H Palmieri

unread,
Aug 29, 2022, 9:39:08 PM8/29/22
to sage-support
I'm reviving this discussion because of another ask.sagemath.org post (https://ask.sagemath.org/question/63845/how-reach-octave-or-macaulay2-from-sage-notebook/): someone who had installed octave and macaulay 2, but the app wasn't finding them because of its minimal setting for PATH. This makes me think that a preference panel to set the PATH would be a good idea. As far as I can tell, the app still reads $HOME/.sage/init.sage, so people can use that instead of modifying an IPython profile function, right? But a small preference panel might be nice.

--
John

Marc Culler

unread,
Aug 30, 2022, 8:16:16 AM8/30/22
to sage-s...@googlegroups.com
OK, I'll work on that for 9.7.

- Marc

Reply all
Reply to author
Forward
0 new messages