5

I have a compiled Python file, path/program.pyc.

I want to execute it with my current globals() and locals(). I tried:

with open('path/program.pyc','rb') as f:
   code = f.read()
   exec(code, globals(), locals())

More specifically, what I want to have is:

a.py:

a = 1
# somehow run b.pyc

b.py:

print(a)

When I run a.py, I want to see the output: 1.

Actually execfile() does exactly what I want, but it only works for .py files not .pyc files. I am looking for a version of execfile() that works for .pyc files.

Sait
  • 17,659
  • 17
  • 66
  • 97

2 Answers2

3

There may be a better way but using uncompyle2 to get the source and execing will do what you need:

a = 1

import uncompyle2
from StringIO import StringIO
f = StringIO()
uncompyle2.uncompyle_file('path/program.pyc', f)
f.seek(0)
exec(f.read(), globals(), locals())

Running b.pyc from a should output 1.

Padraic Cunningham
  • 168,988
  • 22
  • 228
  • 312
-3

Use __import__

Note that you need to use standard python package notation rather than a path and you will need to make sure your file is on sys.path

Something like __import__('path.program', globals(), locals()) should do the trick.

ThePyGuy
  • 13,387
  • 4
  • 15
  • 42
Tim Wakeham
  • 1,009
  • 1
  • 8
  • 12