Execute python script inside a python script
Question:
I have a scenario where i want to dynamically generate a python script – inside my main python script – store it as a string and then when need be, execute this dynamically generated script from my main script.
Is this possible, if so how?
thanks
Answers:
May want to look at the statement exec
: http://docs.python.org/release/2.5.2/ref/exec.html
Read up on the execfile()
function.
http://docs.python.org/library/functions.html?highlight=exec#execfile
Not sure how wise this is but isn’t the exec function what you use if you need to execute Python code?
If you want to execute the script within the context of the main script, you might want to check eval
[ http://docs.python.org/py3k/library/functions.html#eval ]
For a script in a file use exec
For a script in a string use eval
!!! But !!!
before you use strings passed in from an external source, sanity check them!
Otherwise you expose the ability to execute arbitrary code from
within you program,
so range check your variables!
You do not ever want to be asking the question:
“excuse me mam, did you really name your son Robert’); DROP TABLE students; — “?
If you dont understand the reference – see this quick cartoon…
but when you EVAL – you are taking full responsibility for the instructions that you are eval’ing.
There is precedence for what you are trying to do. The collections.namedtuple function builds a template string which is passed to exec
in order to build a dynamically defined class.
As of Python version 3.11, execfile
(which was the most convenient function) is not listed as built-in function anymore.
@George Lambert answer is the way to go. I’ll add just some code for quick reference.
Run script within script
To run the script "run_me.py" within the script "main.py" do this:
- run_me.py be like
print("hello_world")
- main.py be like
with open("run_me.py", "r") as fl:
exec(fl.read())
Run code contained in a string
To run the code contained in a string us eval
:
- main.py be like
string_w_py_code = "print('hello world')"
eval(string_w_py_code)
I have a scenario where i want to dynamically generate a python script – inside my main python script – store it as a string and then when need be, execute this dynamically generated script from my main script.
Is this possible, if so how?
thanks
May want to look at the statement exec
: http://docs.python.org/release/2.5.2/ref/exec.html
Read up on the execfile()
function.
http://docs.python.org/library/functions.html?highlight=exec#execfile
Not sure how wise this is but isn’t the exec function what you use if you need to execute Python code?
If you want to execute the script within the context of the main script, you might want to check eval
[ http://docs.python.org/py3k/library/functions.html#eval ]
For a script in a file use exec
For a script in a string use eval
!!! But !!!
before you use strings passed in from an external source, sanity check them!
Otherwise you expose the ability to execute arbitrary code from
within you program,
so range check your variables!
You do not ever want to be asking the question:
“excuse me mam, did you really name your son Robert’); DROP TABLE students; — “?
If you dont understand the reference – see this quick cartoon…
but when you EVAL – you are taking full responsibility for the instructions that you are eval’ing.
There is precedence for what you are trying to do. The collections.namedtuple function builds a template string which is passed to exec
in order to build a dynamically defined class.
As of Python version 3.11, execfile
(which was the most convenient function) is not listed as built-in function anymore.
@George Lambert answer is the way to go. I’ll add just some code for quick reference.
Run script within script
To run the script "run_me.py" within the script "main.py" do this:
- run_me.py be like
print("hello_world")
- main.py be like
with open("run_me.py", "r") as fl:
exec(fl.read())
Run code contained in a string
To run the code contained in a string us eval
:
- main.py be like
string_w_py_code = "print('hello world')"
eval(string_w_py_code)