Co-authored with Arnav Sood
While Jupyter notebooks are a great way to get started with the language, eventually you will want to use more powerful tools.
We’ll discuss a few of them here, such as
- Text editors like Atom, which come with rich Julia support for debugging, documentation, git integration, plotting and inspecting data, and code execution.
- The Julia REPL, which has specialized modes for package management, shell commands, and help.
Creating a Startup File (Recommended)¶
Whenever the Julia compiler or REPL starts, it will look for a file called
startup.jl (see Julia Manual).
We provide a file here which does two things
- Makes the REPL shell mode “sticky,” so you don’t need to keep running
;for new commands.
- Loads the
Revise.jlpackage on startup, which lets you see changes you make to a package in real-time (i.e., no need to quit the REPL, open again, and load again).
The location for the file is relative to your default Julia environment (e.g.
C:\Users\USERNAME\.julia\config\startup.jl on Windows).
Recall that you can find the location of the
~/.julia directory by running
Note: On Mac, this won’t be visible in the Finder unless you specifically enable that option, but you can get to it by running
cd .julia; open . from a new terminal.
To add the file:
- In the
juliaterminal, type the following
] add Revise REPL; precompile
- Create the
~/.julia/config/directory if necessary in the terminal or file explorer.
- Download the file startup.jl into that directory.
- For convenience, you may find it useful on your operating system to change the directory where the REPL starts.
On Windows, if you have a shortcut on your desktop or on the taskbar, you could: (1) right-click on the icon; (2) right click on the “julia” text; (3) choose “Properties”, and (4) change the “Start In” to be something such as
Previously, we discussed basic use of the Julia REPL (“Read-Evaluate-Print Loop”).
Here, we’ll consider some more advanced features.
; brings you into shell mode, which lets you run bash commands (PowerShell on Windows)
You can also use Julia variables from shell mode
x = 2
; echo $x
] brings you into package mode.
] add Expectationswill add a package (here,
] rm Expectationswill remove that package.
] stwill show you a snapshot of what you have installed.
] upwill (intelligently) upgrade versions of your packages.
] precompilewill precompile everything possible.
] buildwill execute build scripts for all packages.
] previewbefore a command (i.e.,
] preview up) will display the changes without executing.
You can get a full list of package mode commands by running
Welcome to the Pkg REPL-mode. To return to the julia> prompt, either press backspace when the input line is empty or press Ctrl+C. Synopsis pkg> cmd [opts] [args] Multiple commands can be given on the same line by interleaving a ; between the commands. Commands activate: set the primary environment the package manager manipulates add: add packages to project build: run the build script for packages develop: clone the full package repo locally for development free: undoes a pin, develop, or stops tracking a repo gc: garbage collect packages not used for a significant time generate: generate files for a new project help: show this message instantiate: downloads all the dependencies for the project pin: pins the version of packages precompile: precompile all the project dependencies preview: previews a subsequent command without affecting the current state remove: remove packages from project or manifest resolve: resolves to update the manifest from changes in dependencies of developed packages status: summarize contents of and changes to environment test: run tests for packages update: update packages in manifest registry add: add package registries registry remove: remove package registries registry status: information about installed registries registry update: update package registries
On some operating systems (such as OSX) REPL pasting may not work for package mode, and you will need to access it in the standard way (i.e., hit
] first and then run your commands).
? will bring you into help mode.
The key use case is to find docstrings for functions and macros, e.g.
Note that objects must be loaded for Julia to return their documentation, e.g.
will fail, but
As discussed previously, eventually you will want to use a fully fledged text editor.
There are several reasons to use a text editor like Atom, including
- Git integration (more on this in the next lecture).
- Painless inspection of variables and data.
- Easily run code blocks, and drop in custom snippets of code.
- Integration with Julia documentation and plots.
- Download and Install Atom from the Atom website.
(Optional, but recommended): Change default Atom settings
Ctrl-,to get the
- Choose the
line-ending-selectorinto the Filter and then click “Settings” for that package
- Change the default line ending to
LF(only necessary on Windows)
- Change the default line ending to
Choose the Editor tab
- Turn on
- Set the
Tab Lengthdefault to
- Turn on
Ctrl-,to get the Settings pane.
- Go to the
uber-junointo the search box and then click Install on the package that appears.
- Wait while Juno installs dependencies.
- When it asks you whether or not to use the standard layout, click
At that point, you should see a built-in REPL at the bottom of the screen and be able to start using Julia and Atom.
Sometimes, Juno will fail to find the Julia executable (say, if it’s installed somewhere nonstandard, or you have multiple).
To do this
Ctrl-,to get Settings pane, and select the Packages tab.
- Type in
julia-clientand choose Settings.
- Find the Julia Path, and fill it in with the location of the Julia binary.
- To find the binary, you could run
Sys.BINDIRin the REPL, then add in an additional
/juliato the end of the screen.
C:\Users\YOURUSERNAME\AppData\Local\Julia-1.0.1\bin\julia.exeon Windows as
See the setup instructions for Juno if you have further issues.
If you upgrade Atom and it breaks Juno, run the following in a terminal.
apm uninstall ink julia-client apm install ink julia-client
If you aren’t able to install
apm in your PATH, you can do the above by running the following in PowerShell:
] add IJulia ] build IJulia
This will install (and build) the
To get it working with Atom, open the command palette and type “Julia Client: Settings.”
Then, in the box labelled “Julia Path,” enter the path to yor Julia executabe.
You can find the folder by running
Sys.BINDIR in a new REPL, and then add the
/julia at the end to give the exact path.
If you follow the instructions, you should see something like this when you open a new file.
If you don’t, simply go to the command palette and type “Julia standard layout”
The bottom pane is a standard REPL, which supports the different modes above.
The “workspace” pane is a snapshot of currently-defined objects.
For example, if we define an object in the REPL
x = 2
Our workspace should read
ans variable simply captures the result of the last computation.
Documentation pane simply lets us query Julia documentation
Plots pane captures Julia plots output (the code is as follows)
using Plots gr(fmt = :png); data = rand(10, 10) h = heatmap(data)
Note: The plots feature is not perfectly reliable across all plotting backends, see the Basic Usage page.
Julia’s package manager lets you set up Python-style “virtualenvs,” or subsets of packages that draw from an underlying pool of assets on the machine.
This way, you can work with (and specify) the dependencies (i.e., required packages) for one project without worrying about impacts on other projects.
environmentis a set of packages specified by a
Project.toml(and optionally, a
registryis a git repository corresponding to a list of (typically) registered packages, from which Julia can pull (for more on git repositories, see version control).
depotis a directory, like
~/.julia, which contains assets (compile caches, registries, package source directories, etc.).
Essentially, an environment is a dependency tree for a project, or a “frame of mind” for Julia’s package manager.
- We can see the default (
v1.1) environment as such
Project quantecon-notebooks-julia v0.5.0 Status `~/repos/lecture-source-jl/_build/website/jupyter/executed/Project.toml` [2169fc97] AlgebraicMultigrid v0.2.2 [28f2ccd6] ApproxFun v0.11.5 [7d9fca2a] Arpack v0.3.1 [aae01518] BandedMatrices v0.10.1 [6e4b80f9] BenchmarkTools v0.4.3 [a134a8b2] BlackBoxOptim v0.5.0 [ffab5731] BlockBandedMatrices v0.4.6 [324d7699] CategoricalArrays v0.7.1 [34da2185] Compat v2.1.0 [a93c6f00] DataFrames v0.19.4 [1313f7d8] DataFramesMeta v0.5.0 [5721bf48] DataVoyager v0.3.1 [39dd38d3] Dierckx v0.4.1 [9fdde737] DiffEqOperators v3.5.0 [31c24e10] Distributions v0.21.3 [2fe49d83] Expectations v1.1.1 [a1e7a1ef] Expokit v0.2.0 [d4d017d3] ExponentialUtilities v1.5.1 [442a2c76] FastGaussQuadrature v0.4.0 [1a297f60] FillArrays v0.6.4 [9d5cd8c9] FixedEffectModels v0.8.5 ⚲ [c8885935] FixedEffects v0.3.0 ⚲ [587475ba] Flux v0.9.0 [f6369f11] ForwardDiff v0.10.3 [38e38edf] GLM v1.3.1 ⚲ [28b8d3ca] GR v0.41.0  IncompleteLU v0.1.1 [43edad99] InstantiateFromURL v0.4.0 [a98d9a8b] Interpolations v0.12.2 [b6b21f68] Ipopt v0.6.0 [42fd0dbc] IterativeSolvers v0.8.1 [4076af6c] JuMP v0.20.0 [5ab0869b] KernelDensity v0.5.1 [ba0b0d4f] Krylov v0.3.0 [0b1a1467] KrylovKit v0.4.0 [b964fa9f] LaTeXStrings v1.0.3 [5078a376] LazyArrays v0.10.0 [0fc2ff8b] LeastSquaresOptim v0.7.4 [093fc24a] LightGraphs v1.3.0 [7a12625a] LinearMaps v2.5.2 [5c8ed15e] LinearOperators v0.5.4 [76087f3c] NLopt v0.5.1 [2774e3e8] NLsolve v4.0.0 [429524aa] Optim v0.19.3 [1dea7af3] OrdinaryDiffEq v5.3.0 [d96e819e] Parameters v0.12.0 [14b8a8f1] PkgTemplates v0.6.3 [91a5bcdd] Plots v0.27.0 [f27b6e38] Polynomials v0.5.2 [af69fa37] Preconditioners v0.3.0 [92933f4c] ProgressMeter v1.1.0 [1fd47b50] QuadGK v2.1.0 [fcd29c91] QuantEcon v0.16.1 [1a8c2f83] Query v0.12.2 [ce6b1742] RDatasets v0.6.3 [d519eb52] RegressionTables v0.2.2 ⚲ [295af30f] Revise v2.2.0 [f2b01f46] Roots v0.8.3 [47a9eef4] SparseDiffTools v0.8.0 [684fba80] SparsityDetection v0.1.1 [90137ffa] StaticArrays v0.11.0 [2913bbd2] StatsBase v0.32.0 [3eaba693] StatsModels v0.6.5 [f3b207a7] StatsPlots v0.12.0 [112f6efa] VegaLite v0.7.0 [e88e6eb3] Zygote v0.3.4 [37e2e46d] LinearAlgebra [9a3f8284] Random [2f01184e] SparseArrays [10745b16] Statistics [8dfed614] Test
- We can also create and activate a new environment
] generate ExampleEnvironment
Generating project ExampleEnvironment: ExampleEnvironment/Project.toml ExampleEnvironment/src/ExampleEnvironment.jl
- And go to it
; cd ExampleEnvironment
- To activate the directory, simply
] activate .
Activating environment at `~/repos/lecture-source-jl/_build/website/jupyter/executed/more_julia/ExampleEnvironment/Project.toml`
where “.” stands in for the “present working directory”.
- Let’s make some changes to this
] add Expectations Parameters
Updating registry at `~/.julia/registries/General` Updating git-repo `https://github.com/JuliaRegistries/General.git` Resolving package versions... Updating `~/repos/lecture-source-jl/_build/website/jupyter/executed/more_julia/ExampleEnvironment/Project.toml` [2fe49d83] + Expectations v1.3.0 [d96e819e] + Parameters v0.12.0 Updating `~/repos/lecture-source-jl/_build/website/jupyter/executed/more_julia/ExampleEnvironment/Manifest.toml` [7d9fca2a] + Arpack v0.4.0  + Arpack_jll v3.5.0+2 [9e28174c] + BinDeps v1.0.0 [b99e7846] + BinaryProvider v0.5.8 [34da2185] + Compat v3.6.0 [9a962f9c] + DataAPI v1.1.0 [864edb3b] + DataStructures v0.17.10 [31c24e10] + Distributions v0.22.5 [2fe49d83] + Expectations v1.3.0 [442a2c76] + FastGaussQuadrature v0.4.2 [1a297f60] + FillArrays v0.8.5 [e1d29d7a] + Missings v0.4.3 [4536629a] + OpenBLAS_jll v0.3.7+6 [bac558e1] + OrderedCollections v1.1.0 [90014a1f] + PDMats v0.9.11 [d96e819e] + Parameters v0.12.0 [1fd47b50] + QuadGK v2.3.1 [79098fc4] + Rmath v0.6.1 [f50d1b31] + Rmath_jll v0.2.2+0 [a2af1166] + SortingAlgorithms v0.3.1 [276daf66] + SpecialFunctions v0.8.0 [2913bbd2] + StatsBase v0.32.2 [4c63d2b9] + StatsFuns v0.9.4 [30578b45] + URIParser v0.4.0 [2a0f44e3] + Base64 [ade2ca70] + Dates [8bb1440f] + DelimitedFiles [8ba89e20] + Distributed [b77e0a4c] + InteractiveUtils [76f85450] + LibGit2 [8f399da3] + Libdl [37e2e46d] + LinearAlgebra [56ddb016] + Logging [d6f4376e] + Markdown [a63ad114] + Mmap [44cfe95a] + Pkg [de0858da] + Printf [3fa0cd96] + REPL [9a3f8284] + Random [ea8e919c] + SHA [9e88b42a] + Serialization [1a1011a3] + SharedArrays [6462fe0b] + Sockets [2f01184e] + SparseArrays [10745b16] + Statistics [4607b0f0] + SuiteSparse [8dfed614] + Test [cf7118a7] + UUIDs [4ec0a83e] + Unicode
Note the lack of commas
- To see the changes, simply open the
ExampleEnvironmentdirectory in an editor like Atom.
The Project TOML should look something like this
name = "ExampleEnvironment" uuid = "14d3e79e-e2e5-11e8-28b9-19823016c34c" authors = ["QuantEcon User <firstname.lastname@example.org>"] version = "0.1.0" [deps] Expectations = "2fe49d83-0758-5602-8f54-1f90ad0d522b" Parameters = "d96e819e-fc66-5662-9728-84c9c7592b0a"
We can also
Precompiling project... Precompiling ExampleEnvironment
┌ Info: Precompiling ExampleEnvironment [5f75768a-29a6-4f23-9445-af2375764ce8] └ @ Base loading.jl:1273
Note The TOML files are independent of the actual assets (which live in
You can think of the TOML as specifying demands for resources, which are supplied by the
~/.julia user depot.
- To return to the default Julia environment, simply
Activating environment at `~/repos/lecture-source-jl/_build/website/jupyter/executed/Project.toml`
without any arguments.
- Lastly, let’s clean up
; cd ..
; rm -rf ExampleEnvironment
using InstantiateFromURL github_project("QuantEcon/quantecon-notebooks-julia", version = "0.5.0") # github_project("QuantEcon/quantecon-notebooks-julia", version = "0.5.0", instantiate = true) # uncomment to force package installation
github_project function does is activate (and if necessary, download, instantiate and precompile) a particular Julia environment.