35

While trying to use Python's exec statement, I got the following error:

TypeError: exec: arg 1 must be a string, file, or code object

I don't want to pass in a string or a file, but what is a code object, and how do I create one?

martineau
  • 119,623
  • 25
  • 170
  • 301
oneself
  • 38,641
  • 34
  • 96
  • 120
  • 13
    Why are you using exec? And what's wrong with passing in a string or file? – Josh Smeaton Apr 24 '11 at 05:05
  • They're described in the [Code Objects](https://docs.python.org/3/c-api/code.html) section of the [Python/C API Reference Manual](https://docs.python.org/3/c-api/index.html). – martineau Sep 12 '21 at 12:05

3 Answers3

37

One way to create a code object is to use compile built-in function:

>>> compile('sum([1, 2, 3])', '', 'single')
<code object <module> at 0x19ad730, file "", line 1>
>>> exec compile('sum([1, 2, 3])', '', 'single')
6
>>> compile('print "Hello world"', '', 'exec')
<code object <module> at 0x19add30, file "", line 1>
>>> exec compile('print "Hello world"', '', 'exec')
Hello world

also, functions have the function attribute __code__ (also known as func_code in older versions) from which you can obtain the function's code object:

>>> def f(s): print s
... 
>>> f.__code__
<code object f at 0x19aa1b0, file "<stdin>", line 1>
Lie Ryan
  • 62,238
  • 13
  • 100
  • 144
  • 10
    The bit that puzzles me about the OP's question (and acceptance of this answer) is that if they're going to pass a string to `compile`, most of the time they may as well pass it directly to `exec` and let `exec` compile it to a code object behind the scenes. The only reason to call `compile` directly is if the application has a specific need to separate the compilation and execution steps (e.g. the same code object may be invoked more than once, or the syntax check is desired when the code is entered, even if it won't be run until later). – ncoghlan Apr 24 '11 at 16:53
  • What does the line number indicate in the output of compile command? – YatShan Dec 17 '19 at 07:47
  • @YatShan: It's not the output of the compile command. It's the string return from the automatic call to `repr(f.__code__)` the Python interactive shell made to so the value of the last expression typed-in (i.e. `f.__code__`). It says "line 1" because that's the line number of the function `def`. – martineau Sep 12 '21 at 12:52
30

There is an excellent blog post by Dan Crosta explaining this topic, including how to create code objects manually, and how to disassemble them again:

Exploring Python Code Objects

Daniel Werner
  • 1,350
  • 16
  • 26
  • 3
    Good link. For posterity, if the link becomes dead: the page discusses creating code objects via `compile`, understanding the object's internals, and looks at the underlying byte code a bit. – Mike Williamson Apr 06 '19 at 16:40
18

Code objects are described here:

Code objects represent byte-compiled executable Python code, or bytecode. The difference between a code object and a function object is that the function object contains an explicit reference to the function’s globals (the module in which it was defined), while a code object contains no context; also the default argument values are stored in the function object, not in the code object (because they represent values calculated at run-time). Unlike function objects, code objects are immutable and contain no references (directly or indirectly) to mutable objects.

Jeremy
  • 1
  • 85
  • 340
  • 366
C. K. Young
  • 219,335
  • 46
  • 382
  • 435