Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Running a Python script in Jupyter Notebook, with arguments passing

I have this simple Python script which I run from my Jupyter Notebook. However the arguments I pass to it seemingly are ignored and this results in an exception:

two_digits.py

import sys
input = sys.stdin.read()
tokens = input.split()
a = int(tokens[0])
b = int(tokens[1])
print(a + b)

%run two_digits 3 5

ndexError                                Traceback (most recent call last)
D:\Mint_ns\two_digits.py in <module>()
      5 tokens = input.split()
      6 
----> 7 a = int(tokens[0])
      8 
      9 b = int(tokens[1])

IndexError: list index out of range
like image 632
user8270077 Avatar asked Jul 27 '18 05:07

user8270077


People also ask

How do you pass arguments to a Python script?

In Python, arguments are passed to a script from the command line using the sys package. The argv member of sys ( sys. argv ) will store all the information in the command line entry and can be accessed inside the Python script. Python's getopt module can also be used to parse named arguments.

How do I run a Python script in a Jupyter Notebook?

To run a piece of code, click on the cell to select it, then press SHIFT+ENTER or press the play button in the toolbar above. Additionally, the Cell dropdown menu has several options to run cells, including running one cell at a time or to run all cells at once.

What does %% capture do Python?

IPython has a cell magic, %%capture , which captures the stdout/stderr of a cell. With this magic you can discard these streams or store them in a variable. By default, %%capture discards these streams. This is a simple way to suppress unwanted output.


2 Answers

You need to use sys.argv instead of sys.stdin.read():

two_digits.py

import sys
args = sys.argv  # a list of the arguments provided (str)
print("running two_digits.py", args)
a, b = int(args[1]), int(args[2])
print(a, b, a + b)

command line / jupyter magic line:

%run two_digits 3 5

or, with a slightly different output:
Note: this uses a ! prefix to indicate command line to jupyter

!ipython two_digits.py 2 3

output: (using magic line %run)

running two_digits.py ['two_digits.py', '2', '3']
2 3 5
like image 82
Reblochon Masque Avatar answered Oct 16 '22 09:10

Reblochon Masque


%%file calc.py

from sys import argv

script, a, b, sign = argv

if sign == '+': 
    print(int(a) + int(b))
elif sign == '-':
    print(int(a) - int(b))
else:
    print('I can only add and subtract')

We have several options:

%%!
python calc.py 7 3 +

or

%run calc.py 7 3 +

or

!python calc.py 7 3 +

or with the path in output

!ipython calc.py 7 3 +

To access the output use the first way with %%!. Output is a list (IPython.utils.text.SList)

[In 1]
%%!
python calc.py 7 3 +

[Out 1]
['10']

Now you can use underscore '_'

[In 2]
int(_[0])/2  # 10 / 2

[Out 2]
5.0
like image 28
Szczerski Avatar answered Oct 16 '22 10:10

Szczerski