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
script2.py 0 then
script2.py 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:
But it is not accepting variables properly. When I print out the
sys.argv in script2.py it is the original command call to first script "['C:\script1.py'].
I don't really want to change the original script (i.e. script2.py 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.
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.
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:
In an ideal world, you will be able to call a function inside
for i in range(whatever): script1.some_function(i)
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 @contextlib.contextmanager def redirect_argv(num): sys._argv = sys.argv[:] sys.argv=[str(num)] yield sys.argv = sys._argv with redirect_argv(1): print(sys.argv)
I think this is preferable to passing all your data to the OS and back; that's just silly.