402

I'm trying to execute a file with Python commands from within the interpreter.

I'm trying to use variables and settings from that file, not to invoke a separate process.

mkrieger1
24.2k7 gold badges68 silver badges84 bronze badges
asked Jun 22, 2009 at 15:05
0

12 Answers 12

351

Several ways.

  • From the shell

    python someFile.py
    
  • From inside IDLE, hit F5.

  • If you're typing interactively, try this (Python3):

    >>> exec(open("filename.py").read())
    
  • For Python 2:

    >>> variables= {}
    >>> execfile( "someFile.py", variables )
    >>> print variables # globals from the someFile module
    
Nico Schlömer
59.7k36 gold badges216 silver badges291 bronze badges
answered Jun 22, 2009 at 15:08
Sign up to request clarification or add additional context in comments.

6 Comments

is there any way to provide stdin from a file like using < to the executing script with in the execfile().? @s-lott
@pzkpfw python can point to any version of python. I have seen environments with only python v3 where python points to python3.
@pzkpfw That depends on what python executable the system finds when looking through the folders in the environment variable PATH.
For random GIS people I could call this in ArcGIS Pro exec(open("D:\\Scripts\\myscript.py").read())
I'm finding that the F5 bullet applies to Spyder specifically, and it runs the already-opened temp.py. If I just run python at the Conda prompt, F5 doesn't do anything.
|
279

For Python 2:

>>> execfile('filename.py')

For Python 3:

>>> exec(open("filename.py").read())
# or
>>> from pathlib import Path
>>> exec(Path("filename.py").read_text())

See the documentation. If you are using Python 3.0, see this question.

See answer by @S.Lott for an example of how you access globals from filename.py after executing it.

answered Jun 22, 2009 at 15:07

3 Comments

What does read method do? Unfortunately the official documentation site doesn't provide a clear example and explanation.
It reads the file and returns (by default) the entire contents in one single string, see e.g. w3schools page on file open.
Here are the docs for open(): docs.python.org/3/library/io.html
114

Python 2 + Python 3

exec(open("./path/to/script.py").read(), globals())

This will execute a script and put all it's global variables in the interpreter's global scope (the normal behavior in most scripting environments).

Python 3 exec Documentation

answered Jul 22, 2015 at 14:58

2 Comments

Is there a way to pass a parameter to the script? the following doesn't work: exec(open"setup.py install").read(), globals())
@ben that won't work because open directly reads the code from the script. To pass arguments, look at this answer, but instead of execfile, obviously use exec and open as shown above.
92

Surprised I haven't seen this yet. You can execute a file and then leave the interpreter open after execution terminates using the -i option:

| foo.py |
----------
testvar = 10
def bar(bing):
 return bing*3
--------
$ python -i foo.py
>>> testvar 
10
>>> bar(6)
18
answered Jan 16, 2017 at 21:52

Comments

32

I'm trying to use variables and settings from that file, not to invoke a separate process.

Well, simply importing the file with import filename (minus .py, needs to be in the same directory or on your PYTHONPATH) will run the file, making its variables, functions, classes, etc. available in the filename.variable namespace.

So if you have cheddar.py with the variable spam and the function eggs – you can import them with import cheddar, access the variable with cheddar.spam and run the function by calling cheddar.eggs()

If you have code in cheddar.py that is outside a function, it will be run immediately, but building applications that runs stuff on import is going to make it hard to reuse your code. If a all possible, put everything inside functions or classes.

answered Jun 22, 2009 at 16:18

2 Comments

That won't use the global namespace, as the question requires. Use instead from filename import *
The question does not specifically mention using a global namespace, that may be what the OP wants, but it is not obvious from the question.
20

From my view, the best way is:

import yourfile

and after modifying yourfile.py

reload(yourfile) 

or in python3:

import imp; 
imp.reload(yourfile)

but this will make the function and classes looks like that: yourfile.function1, yourfile.class1.....

If you cannot accept those, the finally solution is:

reload(yourfile)
from yourfile import *
answered Jun 24, 2017 at 6:59

2 Comments

yep... this seems to be the best way... THX! but... reload isn't working for me... i'm in Python 3.9.5... any ideas???
@ZEE , I'm using python 3.8.5, I can use: from importlib import reload. It looks like the imp has been merged to the importlib
14

Just do,

from my_file import *

Make sure not to add .py extension. If your .py file in subdirectory use,

from my_dir.my_file import *
answered Dec 26, 2017 at 6:30

Comments

9

For Python 3:

>>> exec(open("helloworld.py").read())

Make sure that you're in the correct directory before running the command.

To run a file from a different directory, you can use the below command:

with open ("C:\\Users\\UserName\\SomeFolder\\helloworld.py", "r") as file:
 exec(file.read())
answered Aug 8, 2018 at 6:14

Comments

8

I am not an expert but this is what I noticed:

if your code is mycode.py for instance, and you type just 'import mycode', Python will execute it but it will not make all your variables available to the interpreter. I found that you should type actually 'from mycode import *' if you want to make all variables available to the interpreter.

answered Nov 15, 2013 at 21:31

1 Comment

Plus, it should be a comment, not an answer.
8

For python3 use either with xxxx = name of yourfile.

exec(open('./xxxx.py').read())
jhoepken
1,8663 gold badges17 silver badges24 bronze badges
answered Mar 30, 2016 at 14:03

Comments

5

Supposing you desire the following features:

  1. Source file behaves properly in your debugger (filename shows in stack, etc)
  2. __name__ == '__main__' is True so scripts behave properly as scripts.

The exec(open('foo.py').read()) fails feature 1 The import foo strategy fails feature 2

To get both, you need this:

 source = open(filename).read()
 code = compile(source, filename, 'exec')
 exec(code)
answered Nov 19, 2019 at 22:42

1 Comment

An alternative is to use runpy.run_path. Source: python - File "<string>" traceback with line preview - Stack Overflow -- but that one will create a separate "module" for the new script, the old globals() dict passed in (if any) will remain unchanged.
-3
python -c "exec(open('main.py').read())"
answered Oct 2, 2020 at 1:47

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.