Apparent magic number problem

Steven D'Aprano steve+comp.lang.python at pearwood.info
Sat Mar 9 00:22:59 EST 2013


On Fri, 08 Mar 2013 19:48:28 -0500, Colin J. Williams wrote:

> I have a program that I wish to run in both Python 2.7 and Python 3.2
> 
> The program runs correctly under each version, but it runs more slowly
> under 3.2.

Without knowing what your program does, it is impossible to comment on 
why it is slower under 3.2.


> This is probably due to the fact that the .pyc file is created for the
> Python 2.7 execution.

I doubt it.


> When Python 3.2 is run it fails to create a new .pyc file and if the 2.7
> .pyc is offered directly a magic number problem is reported.

What do you mean, "offered directly"? Can you show exactly how you are 
running the program?

 
> Is there a bug here?  it seems to me that the Magic Number exception
> should lead to a new compile of the program.

Certainly not. Consider what that would mean. Suppose I try to run a .pyc 
file directly:

python32 myprogram.pyc 


If myprogram.pyc is compiled for the correct version, it will run. If it 
is not, then an error occurs. You want Python to recompile that. But 
consider what that would mean:

- Python would have to *guess* which .py file it should compile. Just 
because it can find something called "myprogram.py", doesn't mean that it 
is the right file. You might have renamed the file after compiling it, or 
moved it into a different folder. Who knows?

- After guessing what file to compile, it would have to compile it, and 
*delete* the existing .pyc file, overwriting it with the newly compiled 
version. This potentially loses data.

- And finally it would run the brand new .pyc file, which could do 
something *completely different* from the .pyc file you thought you were 
running.


Python only compiles files when you import them, or if you use a tool 
like compileall. Merely running a file does not compile it.

Likewise, if you run:

python myprogram.py

any myprogram.pyc file is ignored. .pyc files are only used if you 
directly run them, or if you import them.


-- 
Steven



More information about the Python-list mailing list