loading...
Cover image for Python Has a Startup File!

Python Has a Startup File!

rpalo profile image Ryan Palo Originally published at assertnotmagic.com ใƒป3 min read

Cover Photo by Uriel Soberanes on Unsplash

So, I want to be clear. I knew that Python has a startup customization file this whole time I've been using Python. I didn't just find out about it this week. I mean, of course Python has a startup file. Everything has a startup file! I just want to make sure you know about it. (Only joking, I had no idea this was a thing.)

Before you bring it up, I already know about bPython, the awesome, syntax-highlighty, tab-completey, auto-indenty, wonderful drop in replacement for the regular Python interpreter. I use it all the time. But that's not what this blog post is about. P.S. if you didn't know about bPython, I highly recommend it (Windows users' mileage may vary).

$PYTHONSTARTUP

If you have the environment variable $PYTHONSTARTUP set to a valid Python file, that file will get run when starting up the Python interpreter.

$ export PYTHONSTARTUP="~/.config/pythonrc.py"

Don't worry about the name of the file. Name it whatever you want! python_startup.py, or just pythonrc. You can also put it in whatever directory you want. Just make sure your $PYTHONSTARTUP environment variable matches. Then, you can put anything you want into that file.

# ~/.config/pythonrc.py
a = "Wahoo!"
print("Soup")
try:
    import numpy as np
except ImportError:
    print("Could not import numpy.")

Try running your Python interpreter.

$ python  # or python3

And you should see something similar to the following:

Python 3.7.0 (default, Jun 29 2018, 20:14:27)
[Clang 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Soup
>>> np
<module 'numpy' from '/usr/local/lib/python3.7/site-packages/numpy/__init__.py'>
>>> np.zeros((3, 2))
array([[0., 0.],
       [0., 0.],
       [0., 0.]])
>>> a
'Wahoo!'

You can import commonly used libraries, create variables for yourself, and more.

sys.ps1 and sys.ps2

One neat thing to do is to set the sys.ps1 and sys.ps2 variables, which control your Python prompts.

# ~/.config/pythonrc.py

import sys

sys.ps1 = "๐ŸŒฎ"
sys.ps2 = "๐Ÿ’ฉ"

# ...

And, back in the interactive REPL:

๐ŸŒฎ for i in range(10):
๐Ÿ’ฉ     print("I am a mature adult.")
๐Ÿ’ฉ
I am a mature adult.
I am a mature adult.
...

In fact, you can even set sys.ps1 and sys.ps2 to objects that aren't even strings! If they're not strings, Python will call str(obj) on them.

# ~/.config/pythonrc.py

import sys
from datetime import datetime

class CustomPS1:
    def __init__(self):
        self.count = 0

    def __str__(self):
        self.count += 1
        return f"({self.count}) {datetime.now().strftime('%H:%m %p')} > "

sys.ps1 = CustomPS1()

And in the interpreter:

(1) 10:06 AM > for i in range(10):
...     print("Am I cool now?")
...
Am I cool now?
Am I cool now?
# ...
(2) 11:06 AM >

The -i Flag

In addition to these new superpowers, you can temporarily make any Python script your startup script. This could come in really handy for some interactive debugging. Let's say you're working on a project and you have a script that defines some functions:

# cool_script.py

def what_time_is_it():
    return "Party Time"

You can use the -i flag when you run the Python interpreter to use cool_script.py as your startup file instead of your usual one.

$ python -i cool_script.py
>>> what_time_is_it()
'Party Time'

If you do some cool things with your startup file, share it with me! I want to know about it! Happy coding!

Originally posted on assert_not magic?

Posted on Jul 4 '18 by:

rpalo profile

Ryan Palo

@rpalo

Ryan is an engineer in the Sacramento Area with a focus in Python, Ruby, and Rust. Bash/Python Exercism mentor. Coding, physics, calculus, music, woodworking. Message me on DEV!

Discussion

markdown guide
 

Did know about python -i, didn't know about PYTHONSTARTUP

Thank you!