diff --git a/examples/installing_julia_and_ijulia.ipynb b/examples/installing_julia_and_ijulia.ipynb index 6e3340c..c8aa8c7 100644 --- a/examples/installing_julia_and_ijulia.ipynb +++ b/examples/installing_julia_and_ijulia.ipynb @@ -1,502 +1,496 @@ { - "metadata": { - "name": "", - "signature": "sha256:6cc182fe80c9d30acd08b6bd72f09639570ffc375cb801cd8430fcd3cd922f9a" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Installating Julia/IJulia on winpython2014-11-08 and after via a Notebook\n", - "###1 - Downloading and Installing the right Julia binary in the right place" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import os\n", - "import sys\n", - "import io" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "os.environ[\"JULIA_HOME\"] = os.environ[\"WINPYDIR\"]+\"\\\\..\\\\tools\\\\Julia\\\\bin\\\\\"\n", - "os.environ[\"JULIA_EXE\"]=\"julia.exe\"\n", - "os.environ[\"JULIA\"]=os.environ[\"JULIA_HOME\"]+os.environ[\"JULIA_EXE\"]\n", - "# for installation we need this\n", - "os.environ[\"JULIAROOT\"]=os.path.join(os.path.split(os.environ[\"WINPYDIR\"])[0] , 'tools','julia' ) " - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# downloading julia (32Mo, may take 1 minute or 2)\n", - "try:\n", - " import urllib.request as urllib2 # Python 3\n", - "except:\n", - " import urllib2 # Python 2\n", - "if 'amd64' in sys.version.lower():\n", - " julia_binary=\"julia-0.3.3-win64.exe\"\n", - " julia_url=\"http://s3.amazonaws.com/julialang/bin/winnt/x64/0.3/julia-0.3.3-win64.exe\"\n", - " hashes=(\"b66922277aa7ab57d58102dc53309640\", \"3acbb8cca9d49585dbb546181210289646f30417\")\n", - "else:\n", - " julia_binary=\"julia-0.3.3-win32.exe\"\n", - " julia_url=\"http://s3.amazonaws.com/julialang/bin/winnt/x86/0.3/julia-0.3.3-win32.exe\"\n", - " hashes=(\"c1da470abf572761e607794bf9f9e7d3\", \"7fc6a68df49c927ad5c0df55fa77c2e4e052c46f\" )\n", - " \n", - "julia_installer=os.environ[\"WINPYDIR\"]+\"\\\\..\\\\tools\\\\\"+julia_binary\n", - "os.environ[\"julia_installer\"]=julia_installer\n", - "g = urllib2.urlopen(julia_url) \n", - "with io.open(julia_installer, 'wb') as f:\n", - " f.write(g.read())\n", - "g.close\n", - "g = None" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 3 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "#checking it's there\n", - "!dir %julia_installer%" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " Le volume dans le lecteur D s'appelle DATA\n", - " Le num\u201aro de s\u201arie du volume est 10BD-2ADB\n", - "\n", - " R\u201apertoire de D:\\result_tests\\WinPython-64bit-2.7.8.4_build3\\tools\n", - "\n", - "03/12/2014 17:54 32\u00ff758\u00ff424 julia-0.3.3-win64.exe\n", - " 1 fichier(s) 32\u00ff758\u00ff424 octets\n", - " 0 R\u201ap(s) 215\u00ff579\u00ff164\u00ff672 octets libres\n" - ] - } - ], - "prompt_number": 4 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# checking it's the official julia0.3.2\n", - "import hashlib\n", - "def give_hash(of_file, with_this):\n", - " with io.open(julia_installer, 'rb') as f:\n", - " return with_this(f.read()).hexdigest() \n", - "print (\" \"*12+\"MD5\"+\" \"*(32-12-3)+\" \"+\" \"*15+\"SHA-1\"+\" \"*(40-15-5)+\"\\n\"+\"-\"*32+\" \"+\"-\"*40)\n", - "\n", - "print (\"%s %s %s\" % (give_hash(julia_installer, hashlib.md5) , give_hash(julia_installer, hashlib.sha1),julia_installer))\n", - "assert give_hash(julia_installer, hashlib.md5) == hashes[0]\n", - "assert give_hash(julia_installer, hashlib.sha1) == hashes[1]" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - " MD5 SHA-1 \n", - "-------------------------------- ----------------------------------------\n", - "b66922277aa7ab57d58102dc53309640 3acbb8cca9d49585dbb546181210289646f30417 D:\\result_tests\\WinPython-64bit-2.7.8.4_build3\\python-2.7.8.amd64\\..\\tools\\julia-0.3.3-win64.exe" - ] - }, - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# let's install it (add a /S before /D if you want silence mode installation)\n", - "#nullsoft installers don't accept . or .. conventions\n", - "\n", - "# If you are \"USB life style\", or multi-winpython\n", - "# ==> UN-CLICK the OPTION 'CREATE a StartMenuFolder and Shortcut' <== (when it will show up)\n", - "!start cmd /C %julia_installer% /D=%JULIAROOT%\n" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "###2 - Initialize Julia , IJulia, and make them link to winpython" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Writing a julia initial run script, for convenience\n", - "bat_text = r\"\"\"\n", - "@echo off\n", - "set WINPYDIR=%~dp0..\\blablaPYTHON\n", - "set WINPYVER=blablaWINPYVER\n", - "set HOME=%WINPYDIR%\\..\\settings\n", - "set PATH=%WINPYDIR%\\Lib\\site-packages\\PyQt4;%WINPYDIR%\\;%WINPYDIR%\\DLLs;%WINPYDIR%\\Scripts;%WINPYDIR%\\..\\tools;%WINPYDIR%\\..\\tools\\mingw32\\bin;%PATH%;%WINPYDIR%\\..\\tools\\TortoiseHg\n", - "\n", - "set JULIA_HOME=%WINPYDIR%\\..\\tools\\Julia\\bin\\\n", - "if exist \"%JULIA_HOME%\" goto julia_next\n", - "echo --------------------\n", - "echo First install Julia in \\tools\\Julia of winpython\n", - "echo suggestion : don't create Julia shortcuts, nor menu, nor desktop icons \n", - "echo (they would create a .julia in your home directory rather than here)\n", - "echo When it will be done, launch again this .bat\n", - "\n", - "if not exist \"%JULIA_HOME%\" goto julia_end\n", - "\n", - ":julia_next\n", - "set SYS_PATH=%PATH%\n", - "set PATH=%JULIA_HOME%;%SYS_PATH%\n", - "\n", - "set JULIA_EXE=julia.exe\n", - "set JULIA=%JULIA_HOME%%JULIA_EXE%\n", - "set private_libdir=bin\n", - "if not exist \"%JULIA_HOME%..\\lib\\julia\\sys.ji\" ( ^\n", - "echo \"Preparing Julia for first launch. This may take a while\" \n", - "echo \"You may see two git related errors. This is completely normal\" \n", - "cd \"%JULIA_HOME%..\\share\\julia\\base\" \n", - "\"%JULIA%\" --build \"%JULIA_HOME%..\\lib\\julia\\sys0\" sysimg.jl \n", - "\"%JULIA%\" --build \"%JULIA_HOME%..\\lib\\julia\\sys\" -J sys0.ji sysimg.jl \n", - "popd && pushd \"%cd%\" )\n", - "\n", - "echo \"julia!\"\n", - "echo --------------------\n", - "echo to install Ijulia for Winpython (the first time) :\n", - "echo type 'julia'\n", - "echo type in Julia prompt 'Pkg.add(\"IJulia\")'\n", - "echo type in Julia prompt 'Pkg.add(\"PyCall\")'\n", - "echo type in Julia prompt 'Pkg.add(\"PyPlot\")'\n", - "echo type in Julia prompt 'Pkg.add(\"Interact\")'\n", - "echo type in Julia prompt 'Pkg.add(\"SymPy\")'\n", - "echo type 'Ctrl + 'D' to quit Julia \n", - "echo nota : type 'help()' to get help in Julia\n", - "echo --------------------\n", - "rem 2014-08-23 refinement\n", - "echo or let me do it now\n", - "pause\n", - "echo Pkg.add(\"IJulia\");>this_is_temporary.jl\n", - "echo Pkg.add(\"PyCall\");>>this_is_temporary.jl\n", - "echo Pkg.add(\"PyPlot\");>>this_is_temporary.jl\n", - "echo Pkg.add(\"Interact\");>>this_is_temporary.jl\n", - "echo Pkg.add(\"SymPy\");>>this_is_temporary.jl\n", - "@echo on\n", - "julia this_is_temporary.jl \n", - "@echo off\n", - "\n", - "echo Julia installed\n", - "echo use the \"ijulia_launcher.bat\" script to launch Ijulia directly\n", - "pause\n", - ":julia_end\n", - "rem cmd.exe /k\n", - "\"\"\"\n", - "bat_text = bat_text.replace(\"blablaPYTHON\",os.path.split(os.environ[\"WINPYDIR\"])[1])\n", - "bat_text = bat_text.replace(\"blablaWINPYVER\",os.environ[\"WINPYVER\"])\n", - "julia_initializer_bat=os.environ[\"WINPYDIR\"]+\"\\\\..\\\\scripts\\\\initialize_julia_once.bat\"\n", - "if sys.version_info[0] == 3:\n", - " with io.open(julia_initializer_bat, 'w', encoding = sys.getdefaultencoding() ) as f:\n", - " for line in bat_text.splitlines():\n", - " f.write('%s\\n' % line )\n", - "else:\n", - " with io.open(julia_initializer_bat, 'wb' ) as f:\n", - " for line in bat_text.splitlines():\n", - " f.write('%s\\r\\n' % line.encode(sys.getdefaultencoding()) )" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 7 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# let's initialize Julia and install \"IJulia\", \"PyCall\", and \"PyPlot\" Julia modules with this .bat just created\n", - "# may take about 10 minutes (Julia pre-compiles itself and download a lot of things)\n", - "!start cmd /C %WINPYDIR%\\\\..\\\\scripts\\\\initialize_julia_once.bat" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 8 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# let's launch Ijulia for Ipython now\n", - "# Writing a julia initial run script, for convenience\n", - "bat_text = r\"\"\"\n", - "@echo off\n", - "\n", - "set WINPYDIR=%~dp0..\\blablaPYTHON\n", - "set WINPYVER=blablaWINPYVER\n", - "set HOME=%WINPYDIR%\\..\\settings\n", - "set PATH=%WINPYDIR%\\Lib\\site-packages\\PyQt4;%WINPYDIR%\\;%WINPYDIR%\\DLLs;%WINPYDIR%\\Scripts;%WINPYDIR%\\..\\tools;%WINPYDIR%\\..\\tools\\mingw32\\bin;%PATH%;%WINPYDIR%\\..\\tools\\TortoiseHg\n", - "\n", - "set JULIA_HOME=%WINPYDIR%\\..\\tools\\Julia\\bin\\\n", - "\n", - "set SYS_PATH=%PATH%\n", - "set PATH=%JULIA_HOME%;%SYS_PATH%\n", - "\n", - "set JULIA_EXE=julia.exe\n", - "set JULIA=%JULIA_HOME%%JULIA_EXE%\n", - "\n", - "Ipython notebook --profile julia\n", - "echo to use julia_magic from Ipython, type \"Ipython notebook\" instead.\n", - ":julia_end\n", - "cmd.exe /k\n", - "\"\"\"\n", - "bat_text = bat_text.replace(\"blablaPYTHON\",os.path.split(os.environ[\"WINPYDIR\"])[1])\n", - "bat_text = bat_text.replace(\"blablaWINPYVER\",os.environ[\"WINPYVER\"])\n", - "\n", - "ijulia_launcher_bat=os.environ[\"WINPYDIR\"]+\"\\\\..\\\\scripts\\\\ijulia_launcher.bat\"\n", - "if sys.version_info[0] == 3:\n", - " with io.open(ijulia_launcher_bat, 'w', encoding = sys.getdefaultencoding() ) as f:\n", - " for line in bat_text.splitlines():\n", - " f.write('%s\\n' % line )\n", - "else:\n", - " with io.open(ijulia_launcher_bat, 'wb' ) as f:\n", - " for line in bat_text.splitlines():\n", - " f.write('%s\\r\\n' % line.encode(sys.getdefaultencoding()) )\n" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 9 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "###3 - Launching IJulia \n", - "\n", - "either from here\n", - "\n", - "either with your new winpython**\\scripts\\ijulia_launcher.bat" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "!start cmd /C %WINPYDIR%\\\\..\\\\scripts\\\\ijulia_launcher.bat" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 10 - }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Installating Julia/IJulia on winpython2015-03-27 and after via a Notebook\n", + "###1 - Downloading and Installing the right Julia binary in the right place" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import os\n", + "import sys\n", + "import io" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# downloading julia (32Mo, may take 1 minute or 2)\n", + "try:\n", + " import urllib.request as urllib2 # Python 3\n", + "except:\n", + " import urllib2 # Python 2\n", + "if 'amd64' in sys.version.lower():\n", + " julia_binary=\"julia-0.3.7-win64.exe\"\n", + " julia_url=\"http://s3.amazonaws.com/julialang/bin/winnt/x64/0.3/julia-0.3.7-win64.exe\"\n", + " hashes=(\"90dedbbee5deb569c613543cc709af85\", \"813f049445421b9531cb6a3a4a2871fdbe1ca5d0\" )\n", + "else:\n", + " julia_binary=\"julia-0.3.7-win32.exe\"\n", + " julia_url=\"http://s3.amazonaws.com/julialang/bin/winnt/x86/0.3/julia-0.3.7-win32.exe\"\n", + " hashes=(\"bd2237758fb2a034174249010cf7ba33\", \"4319c95c38622792b112478d240d2586e08430f0\")\n", + " \n", + "julia_installer=os.environ[\"WINPYDIR\"]+\"\\\\..\\\\tools\\\\\"+julia_binary\n", + "os.environ[\"julia_installer\"]=julia_installer\n", + "g = urllib2.urlopen(julia_url) \n", + "with io.open(julia_installer, 'wb') as f:\n", + " f.write(g.read())\n", + "g.close\n", + "g = None" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And now, you should see a IJulia notebook starting next to this IPython Notebook\n", + "name": "stdout", + "output_type": "stream", + "text": [ + " Le volume dans le lecteur D s'appelle DATA\n", + " Le num‚ro de s‚rie du volume est 10BD-2ADB\n", "\n", - "Check a new Ijulia notebook works with a few julia commands\n", - "````\n", - "println(2+2);\n", - "versioninfo(true)\n", - "````\n", + " R‚pertoire de D:\\WinPython\\basedir34\\build\\winpython-3.4.3.amd64\\tools\n", "\n", - "" + "27/03/2015 18:51 36ÿ789ÿ424 julia-0.3.7-win64.exe\n", + " 1 fichier(s) 36ÿ789ÿ424 octets\n", + " 0 R‚p(s) 120ÿ517ÿ468ÿ160 octets libres\n" ] - }, + } + ], + "source": [ + "#checking it's there\n", + "!dir %julia_installer%" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "###4 - Julia Magic ?\n", - "What preceeds should work with all previous version of winpython\n", - "\n", - "This part may only work for recent winpythons " + "name": "stdout", + "output_type": "stream", + "text": [ + " MD5 SHA-1 \n", + "-------------------------------- ----------------------------------------\n", + "90dedbbee5deb569c613543cc709af85 813f049445421b9531cb6a3a4a2871fdbe1ca5d0 D:\\WinPython\\basedir34\\build\\winpython-3.4.3.amd64\\python-3.4.3.amd64\\..\\tools\\julia-0.3.7-win64.exe\n" ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# first, we must patch the path\n", - "import os\n", - "os.environ[\"JULIA_HOME\"] = os.environ[\"WINPYDIR\"]+\"\\\\..\\\\tools\\\\Julia\\\\bin\\\\\" # \\\\bin\"\n", - "os.environ[\"JULIA_EXE\"]=\"julia.exe\"\n", - "if \"\\\\julia\\\\\" not in os.environ[\"PATH\"].lower():\n", - " os.environ[\"JULIA\"]=os.environ[\"JULIA_HOME\"]+\"\"+os.environ[\"JULIA_EXE\"]\n", - " os.environ[\"PATH\"] =os.environ[\"JULIA_HOME\"]+\";\"+os.environ[\"PATH\"]\n", - "#now we can\n", - "%load_ext julia.magic" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Initializing Julia interpreter. This may take some time..." - ] - }, - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "JuliaWarning : not sure I have initialize PyCall package\n", - "\n" - ] - } - ], - "prompt_number": 11 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# don't worry if you see \"Julia error ? Failed to initialize PyCall package\" and continue as usual \n", - "%julia @pyimport matplotlib.pyplot as plt\n", - "%julia @pyimport numpy as np" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 12 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%%julia\n", - "\n", - "# Note how we mix numpy and julia:\n", - "t = linspace(0, 2*pi, 1000); # use the julia linspace\n", - "s = sin(3 * t + 4 * np.cos(2 * t)); # use the numpy cosine and julia sine\n", - "\n", - "fig = plt.gcf() # **** WATCH THIS VARIABLE ****\n", - "plt.plot(t, s, color=\"red\", linewidth=2.0, linestyle=\"--\")" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 13, - "text": [ - "[]" - ] - }, - { - "metadata": {}, - "output_type": "display_data", - "png": "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\n", - "text": [ - "" - ] - } - ], - "prompt_number": 13 - }, + } + ], + "source": [ + "# checking it's the official julia0.3.2\n", + "import hashlib\n", + "def give_hash(of_file, with_this):\n", + " with io.open(julia_installer, 'rb') as f:\n", + " return with_this(f.read()).hexdigest() \n", + "print (\" \"*12+\"MD5\"+\" \"*(32-12-3)+\" \"+\" \"*15+\"SHA-1\"+\" \"*(40-15-5)+\"\\n\"+\"-\"*32+\" \"+\"-\"*40)\n", + "\n", + "print (\"%s %s %s\" % (give_hash(julia_installer, hashlib.md5) , give_hash(julia_installer, hashlib.sha1),julia_installer))\n", + "assert give_hash(julia_installer, hashlib.md5) == hashes[0]\n", + "assert give_hash(julia_installer, hashlib.sha1) == hashes[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "os.environ[\"JULIA_HOME\"] = os.environ[\"WINPYDIR\"]+\"\\\\..\\\\tools\\\\Julia\\\\bin\\\\\"\n", + "os.environ[\"JULIA_EXE\"]=\"julia.exe\"\n", + "os.environ[\"JULIA\"]=os.environ[\"JULIA_HOME\"]+os.environ[\"JULIA_EXE\"]\n", + "# for installation we need this\n", + "os.environ[\"JULIAROOT\"]=os.path.join(os.path.split(os.environ[\"WINPYDIR\"])[0] , 'tools','julia' ) " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# let's install it (add a /S before /D if you want silence mode installation)\n", + "#nullsoft installers don't accept . or .. conventions\n", + "\n", + "# If you are \"USB life style\", or multi-winpython\n", + "# ==> UN-CLICK the OPTION 'CREATE a StartMenuFolder and Shortcut' <== (when it will show up)\n", + "!start cmd /C %julia_installer% /D=%JULIAROOT%\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###2 - Initialize Julia , IJulia, and make them link to winpython" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Writing a julia initial run script, for convenience\n", + "bat_text = r\"\"\"\n", + "@echo off\n", + "set WINPYDIR=%~dp0..\\blablaPYTHON\n", + "set WINPYVER=blablaWINPYVER\n", + "set HOME=%WINPYDIR%\\..\\settings\n", + "set PATH=%WINPYDIR%\\Lib\\site-packages\\PyQt4;%WINPYDIR%\\;%WINPYDIR%\\DLLs;%WINPYDIR%\\Scripts;%WINPYDIR%\\..\\tools;%WINPYDIR%\\..\\tools\\mingw32\\bin;%PATH%;%WINPYDIR%\\..\\tools\\TortoiseHg\n", + "\n", + "set JULIA_HOME=%WINPYDIR%\\..\\tools\\Julia\\bin\\\n", + "if exist \"%JULIA_HOME%\" goto julia_next\n", + "echo --------------------\n", + "echo First install Julia in \\tools\\Julia of winpython\n", + "echo suggestion : don't create Julia shortcuts, nor menu, nor desktop icons \n", + "echo (they would create a .julia in your home directory rather than here)\n", + "echo When it will be done, launch again this .bat\n", + "\n", + "if not exist \"%JULIA_HOME%\" goto julia_end\n", + "\n", + ":julia_next\n", + "set SYS_PATH=%PATH%\n", + "set PATH=%JULIA_HOME%;%SYS_PATH%\n", + "\n", + "set JULIA_EXE=julia.exe\n", + "set JULIA=%JULIA_HOME%%JULIA_EXE%\n", + "set private_libdir=bin\n", + "if not exist \"%JULIA_HOME%..\\lib\\julia\\sys.ji\" ( ^\n", + "echo \"Preparing Julia for first launch. This may take a while\" \n", + "echo \"You may see two git related errors. This is completely normal\" \n", + "cd \"%JULIA_HOME%..\\share\\julia\\base\" \n", + "\"%JULIA%\" --build \"%JULIA_HOME%..\\lib\\julia\\sys0\" sysimg.jl \n", + "\"%JULIA%\" --build \"%JULIA_HOME%..\\lib\\julia\\sys\" -J sys0.ji sysimg.jl \n", + "popd && pushd \"%cd%\" )\n", + "\n", + "echo \"julia!\"\n", + "echo --------------------\n", + "echo to install Ijulia for Winpython (the first time) :\n", + "echo type 'julia'\n", + "echo type in Julia prompt 'Pkg.add(\"IJulia\")'\n", + "echo type in Julia prompt 'Pkg.add(\"PyCall\")'\n", + "echo type in Julia prompt 'Pkg.add(\"PyPlot\")'\n", + "echo type in Julia prompt 'Pkg.add(\"Interact\")'\n", + "echo type in Julia prompt 'Pkg.add(\"Compose\")'\n", + "echo type in Julia prompt 'Pkg.add(\"SymPy\")'\n", + "echo type 'Ctrl + 'D' to quit Julia \n", + "echo nota : type 'help()' to get help in Julia\n", + "echo --------------------\n", + "rem 2014-08-23 refinement\n", + "echo or let me do it now\n", + "pause\n", + "echo Pkg.add(\"IJulia\");>this_is_temporary.jl\n", + "echo Pkg.add(\"PyCall\");>>this_is_temporary.jl\n", + "echo Pkg.add(\"PyPlot\");>>this_is_temporary.jl\n", + "echo Pkg.add(\"Interact\");>>this_is_temporary.jl\n", + "echo Pkg.add(\"Compose\");>>this_is_temporary.jl\n", + "echo Pkg.add(\"SymPy\");>>this_is_temporary.jl\n", + "@echo on\n", + "julia this_is_temporary.jl \n", + "@echo off\n", + "\n", + "echo Julia installed\n", + "echo use the \"ijulia_launcher.bat\" script to launch Ijulia directly\n", + "pause\n", + ":julia_end\n", + "rem cmd.exe /k\n", + "\"\"\"\n", + "bat_text = bat_text.replace(\"blablaPYTHON\",os.path.split(os.environ[\"WINPYDIR\"])[1])\n", + "bat_text = bat_text.replace(\"blablaWINPYVER\",os.environ[\"WINPYVER\"])\n", + "julia_initializer_bat=os.environ[\"WINPYDIR\"]+\"\\\\..\\\\scripts\\\\initialize_julia_once.bat\"\n", + "if sys.version_info[0] == 3:\n", + " with io.open(julia_initializer_bat, 'w', encoding = sys.getdefaultencoding() ) as f:\n", + " for line in bat_text.splitlines():\n", + " f.write('%s\\n' % line )\n", + "else:\n", + " with io.open(julia_initializer_bat, 'wb' ) as f:\n", + " for line in bat_text.splitlines():\n", + " f.write('%s\\r\\n' % line.encode(sys.getdefaultencoding()) )" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# let's initialize Julia and install \"IJulia\", \"PyCall\", and \"PyPlot\" Julia modules with this .bat just created\n", + "# may take about 10 minutes (Julia pre-compiles itself and download a lot of things)\n", + "!start cmd /C %WINPYDIR%\\\\..\\\\scripts\\\\initialize_julia_once.bat" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# let's launch Ijulia for Ipython now\n", + "# Writing a julia initial run script, for convenience\n", + "bat_text = r\"\"\"\n", + "@echo off\n", + "\n", + "set WINPYDIR=%~dp0..\\blablaPYTHON\n", + "set WINPYVER=blablaWINPYVER\n", + "set HOME=%WINPYDIR%\\..\\settings\n", + "set PATH=%WINPYDIR%\\Lib\\site-packages\\PyQt4;%WINPYDIR%\\;%WINPYDIR%\\DLLs;%WINPYDIR%\\Scripts;%WINPYDIR%\\..\\tools;%WINPYDIR%\\..\\tools\\mingw32\\bin;%PATH%;%WINPYDIR%\\..\\tools\\TortoiseHg\n", + "\n", + "set JULIA_HOME=%WINPYDIR%\\..\\tools\\Julia\\bin\\\n", + "\n", + "set SYS_PATH=%PATH%\n", + "set PATH=%JULIA_HOME%;%SYS_PATH%\n", + "\n", + "set JULIA_EXE=julia.exe\n", + "set JULIA=%JULIA_HOME%%JULIA_EXE%\n", + "\n", + "Ipython notebook --profile julia\n", + "echo to use julia_magic from Ipython, type \"Ipython notebook\" instead.\n", + ":julia_end\n", + "cmd.exe /k\n", + "\"\"\"\n", + "bat_text = bat_text.replace(\"blablaPYTHON\",os.path.split(os.environ[\"WINPYDIR\"])[1])\n", + "bat_text = bat_text.replace(\"blablaWINPYVER\",os.environ[\"WINPYVER\"])\n", + "\n", + "ijulia_launcher_bat=os.environ[\"WINPYDIR\"]+\"\\\\..\\\\scripts\\\\ijulia_launcher.bat\"\n", + "if sys.version_info[0] == 3:\n", + " with io.open(ijulia_launcher_bat, 'w', encoding = sys.getdefaultencoding() ) as f:\n", + " for line in bat_text.splitlines():\n", + " f.write('%s\\n' % line )\n", + "else:\n", + " with io.open(ijulia_launcher_bat, 'wb' ) as f:\n", + " for line in bat_text.splitlines():\n", + " f.write('%s\\r\\n' % line.encode(sys.getdefaultencoding()) )\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###3 - Launching IJulia \n", + "\n", + "either from here\n", + "\n", + "either with your new winpython**\\scripts\\ijulia_launcher.bat" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "!start cmd /C %WINPYDIR%\\\\..\\\\scripts\\\\ijulia_launcher.bat" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now, you should see a IJulia notebook starting next to this IPython Notebook\n", + "\n", + "Check a new Ijulia notebook works with a few julia commands\n", + "````\n", + "println(2+2);\n", + "versioninfo(true)\n", + "````\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###4 - Julia Magic ?\n", + "What preceeds should work with all previous version of winpython\n", + "\n", + "This part may only work for recent winpythons " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#5 - To Un-install / Re-install Julia and Ijulia (or other trouble-shooting)\n", - "\n", - "If the Ijulia doesn't work because of a \"dead kernel\" the comes every minute\n", - "(or if you just want to un-install Julia 0.3)\n", - "\n", - "\n", - "- stop all Ipython instances that are running \n", - "\n", - "- launch winpython**\\tools\\Julia\\uninstall.exe\n", - "\n", - "- delete the directory winpython**\\settings\\.julia\n", - "\n", - "- remove winpython**\\settings\\.ipython\\default_julia\n", - "\n", - "(maybe check you don't have an annoying c:\\users\\your_windows_profile\\.ipython\\default_julia)\n", - "\n", - "- re-install\n" + "name": "stdout", + "output_type": "stream", + "text": [ + "Initializing Julia interpreter. This may take some time...\n" ] - }, + } + ], + "source": [ + "# first, we must patch the path\n", + "import os\n", + "os.environ[\"JULIA_HOME\"] = os.environ[\"WINPYDIR\"]+\"\\\\..\\\\tools\\\\Julia\\\\bin\\\\\" # \\\\bin\"\n", + "os.environ[\"JULIA_EXE\"]=\"julia.exe\"\n", + "if \"\\\\julia\\\\\" not in os.environ[\"PATH\"].lower():\n", + " os.environ[\"JULIA\"]=os.environ[\"JULIA_HOME\"]+\"\"+os.environ[\"JULIA_EXE\"]\n", + " os.environ[\"PATH\"] =os.environ[\"JULIA_HOME\"]+\";\"+os.environ[\"PATH\"]\n", + "#now we can\n", + "%load_ext julia.magic" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# don't worry if you see \"Julia error ? Failed to initialize PyCall package\" and continue as usual \n", + "%julia @pyimport matplotlib.pyplot as plt\n", + "%julia @pyimport numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "import julia\n", - "j=julia.Julia()\n", - "j.eval(\"1 +31\")\n", - "j.eval(\"sqrt(1 +31)\")" - ], - "language": "python", + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 15, "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 20, - "text": [ - "5.656854249492381" - ] - } - ], - "prompt_number": 20 - }, + "output_type": "execute_result" + } + ], + "source": [ + "%%julia\n", + "\n", + "# Note how we mix numpy and julia:\n", + "t = linspace(0, 2*pi, 1000); # use the julia linspace\n", + "s = sin(3 * t + 4 * np.cos(2 * t)); # use the numpy cosine and julia sine\n", + "\n", + "fig = plt.gcf() # **** WATCH THIS VARIABLE ****\n", + "plt.plot(t, s, color=\"red\", linewidth=2.0, linestyle=\"--\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#5 - To Un-install / Re-install Julia and Ijulia (or other trouble-shooting)\n", + "\n", + "If the Ijulia doesn't work because of a \"dead kernel\" the comes every minute\n", + "(or if you just want to un-install Julia 0.3)\n", + "\n", + "\n", + "- stop all Ipython instances that are running \n", + "\n", + "- launch winpython**\\tools\\Julia\\uninstall.exe\n", + "\n", + "- delete the directory winpython**\\settings\\.julia\n", + "\n", + "- remove winpython**\\settings\\.ipython\\default_julia\n", + "\n", + "(maybe check you don't have an annoying c:\\users\\your_windows_profile\\.ipython\\default_julia)\n", + "\n", + "- re-install\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [], - "language": "python", + "data": { + "text/plain": [ + "5.656854249492381" + ] + }, + "execution_count": 16, "metadata": {}, - "outputs": [] + "output_type": "execute_result" } ], - "metadata": {} + "source": [ + "import julia\n", + "j=julia.Julia()\n", + "j.eval(\"1 +31\")\n", + "j.eval(\"sqrt(1 +31)\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.4.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}