Run a Python script from another Python script, passing in arguments


I want to run a Python script from another Python script. I want to pass variables like I would using the command line.

For example, I would run my first script that would iterate through a list of values (0,1,2,3) and pass those to the 2nd script 0 then 1, etc.

I found Stack Overflow question 1186789 which is a similar question, but ars's answer calls a function, where as I want to run the whole script, not just a function, and balpha's answer calls the script but with no arguments. I changed this to something like the below as a test:

execfile(" 1")

But it is not accepting variables properly. When I print out the sys.argv in it is the original command call to first script "['C:\'].

I don't really want to change the original script (i.e. in my example) since I don't own it.

I figure there must be a way to do this; I am just confused how you do it.

3/27/2019 10:08:56 AM

Accepted Answer

Try using os.system:

os.system(" 1")

execfile is different because it is designed to run a sequence of Python statements in the current execution context. That's why sys.argv didn't change for you.

9/23/2010 7:33:16 PM

This is inherently the wrong thing to do. If you are running a Python script from another Python script, you should communicate through Python instead of through the OS:

import script1

In an ideal world, you will be able to call a function inside script1 directly:

for i in range(whatever):

If necessary, you can hack sys.argv. There's a neat way of doing this using a context manager to ensure that you don't make any permanent changes.

import contextlib
def redirect_argv(num):
    sys._argv = sys.argv[:]
    sys.argv = sys._argv

with redirect_argv(1):

I think this is preferable to passing all your data to the OS and back; that's just silly.

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow