17

I'm using 2 separate scripts, Scale1.py and Scale2.py. To run them I enter sudo python Scale1.py or sudo python Scale2.py from the terminal command line. I would like to have a line in the Scale2.py script in which if I press a button, the program breaks and runs Scale1.py. Something like this, which doesn't work.

if GPIO.input(23) == False:
    break(sudo python Scale1.py)
Aurora0001
  • 6,357
  • 3
  • 25
  • 39
Rico
  • 273
  • 1
  • 2
  • 4

3 Answers3

26

os.system("sudo python scale1.py")

first you will need to import the os module

import os

I don't have a pi with me atm to test, but this comes from the second answer to this question: https://stackoverflow.com/questions/89228/calling-an-external-command-in-python

mrwhale
  • 404
  • 4
  • 5
12

In general, use the subprocess module

subprocess.call(["sudo","python","scale1.py"]) 

for command line calls.

An example processing the result of a subprocess call;

 result = subprocess.check_output(['sudo','service','mpd','restart'])

Subprocess replaces several older modules and functions, like os.system and os.spawn. It does a good job in sanitizing arguments, so it protects you from shell injection.

https://docs.python.org/2/library/subprocess.html

Of course to run a second python script there is no need for CLI call, you can import those.

Janghou
  • 1,446
  • 1
  • 16
  • 20
6

You can use sudo as harry sib suggested, but you would have to add the user running the first script to the sudoers file.

The best way to run a python script from another python script is to import it. You should have the logic of your script in a method in the second script:

# Scale2.py
def run():
    do_first()
    do_second()
    [...]

# Run it only if called from the command line
if __name__ == '__main__':
    run()
# Scale1.py
import Scale2

if (GPIO.input(23) == False):
    Scale2.run()
Gagaro
  • 356
  • 1
  • 3